Jakie znaki są dozwolone w nazwach zmiennych środowiskowych systemu Linux? Moje pobieżne przeszukiwanie stron podręcznika systemowego i sieci dostarczyło jedynie informacji o tym, jak pracować ze zmiennymi, ale nie o tym, które nazwy są dozwolone.
Mam program Java, który wymaga zdefiniowanej zmiennej środowiskowej zawierającej kropkę, na przykład com.example.fancyproperty
. W systemie Windows mogę ustawić tę zmienną, ale nie udało mi się ustawić jej w Linuksie (próbowałem w SuSE i Ubuntu). Czy ta nazwa zmiennej jest w ogóle dozwolona?
linux
syntax
environment-variables
Christian Semrau
źródło
źródło
-D
opcji wiersza poleceń), więc teraz działa. Oczywiście program wygląda w obu zestawach zmiennych, nie mówiąc mi o tym. Ale nadal jestem ciekawy, które nazwy zmiennych środowiskowych są dozwolone.com_example_fancyproperty
iCOM_EXAMPLE_FANCYPROPERTY
.Odpowiedzi:
Z The Open Group :
Nazwy mogą więc zawierać dowolny znak z wyjątkiem = i NUL, ale:
Więc chociaż nazwy mogą być prawidłowe, twoja powłoka może nie obsługiwać niczego poza literami, cyframi i podkreśleniami.
źródło
[a-zA-Z_][a-zA-Z0-9_]*
(domyślnie sugerując, że ta forma jest rozsądniejsza), ale rzeczywista specyfikacja (cytat 1) wymaga, aby cała implementacja obsługiwała wszystko oprócz=
iNUL
?Sekcja standardów POSIX dotyczących powłok w IEEE Std 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2 Standard powłoki i narzędzi nie definiuje konwencji leksykalnej dla nazw zmiennych, jednak pobieżne spojrzenie na źródło ujawnia, że używa czegoś podobnego do
[a-zA-Z_]+[a-zA-Z0-9_]*
(Edycja: Dodano brakujące podkreślenie w 2. klasie znaków.)
Krótka uwaga, ponieważ niektóre powłoki nie obsługują + w wyrażeniu regularnym, potencjalnie bardziej przenośnym wyrażeniem regularnym może być:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
źródło
[a-zA-Z_][a-zA-Z0-9_]*
Dla takich jak ja, dla których odniesienie do bash-4.1 jest trochę niejasne (616 000 linii kodu), oto kilka wskazówek znajdź odpowiednie wiersze kodu:subst.c: param_expand(), in the default case
->general.h:
/ * Określ dokładnie, z czego składa się legalny identyfikator powłoki. * / #define legal_variable_starter (c) (ISALPHA (c) || (c == ' ')) #define legal_variable_char (c) (ISALNUM (c) || c == ' ')a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit
.Moje szybkie testy pokazały, że zasadniczo przestrzegają tych samych reguł, co nazwy zmiennych w C, a mianowicie
_
i 0-9Więc to wyklucza
.
ich wewnątrz. Każda niedozwolona nazwa zmiennej jest przypisywanaunknown command
.Zostało to przetestowane w ZSH, który jest w większości kompatybilny z BASH.
źródło
Zależy od tego, co rozumiesz przez „dozwolone”.
Ignorowanie Windows na zawsze:
Środowisko to tablica ciągów przekazywana do głównej funkcji programu. Jeśli przeczytasz execve (2), nie zobaczysz żadnych wymagań ani ograniczeń dotyczących tych ciągów innych niż zakończenie zerowe.
Zgodnie z konwencją, każdy ciąg składa się z NAZWA = wartość. Nie ma konwencji cytowania, więc nie możesz mieć znaku „=” w nazwie w tej konwencji.
Normalni ludzie ustalają te warunki, omawiając je ze swoją skorupą. Każda powłoka ma swoje własne pomysły na temat prawidłowych zmiennych NAME, więc musisz przeczytać stronę podręcznika dla powłoki chwili, aby zobaczyć, co o tym myśli.
Ogólnie rzecz biorąc, rzeczy takie jak com.baseball.spit = fleagh są właściwościami systemowymi Javy i niezależnie od tego, czy jakiś program Java chce wrócić do środowiska, lepiej jest określić je za pomocą -D.
źródło
To zależy od powłoki. Domyślam się, że używasz basha domyślnie, w którym to przypadku litery, cyfry i podkreślenia są dozwolone, ale nie możesz rozpocząć nazwy zmiennej liczbą. Od wersji Bash v.3 kropki nie są dozwolone w nazwach zmiennych .
źródło
TAK, MOŻESZ TO ZROBIĆ.
Użyj
exec
ienv
polecenie, aby zaimplementować tę scenę.Testuj urządzenie w Dockerze
Uruchom polecenie w kontenerze:
Sprawdź zmienne środowiskowe:
Służy
ps aux
do sprawdzania, czy PID nie został zmienionySłuży
python
do weryfikacji zmiennej środowiskowejOUTPUT jest
happy-variable-name
.Co się stało?
Inny sposób
Jeśli używasz Dockera, możesz ustawić zmienną w Dockerfile
Jeśli używasz kubernetes, możesz ustawić zmienną za pomocą ConfigMap
test.yaml
Wdróż pod
kubectl apply -f test.yaml
Sprawdź
kubectl logs foobar
wyjście:ConfigMap zezwala na „-”, „_” lub „.”
źródło
Podczas gdy większość powłok nie pozwala na ustawienie zmiennych środowiskowych (jak wspomniano w innych odpowiedziach), jeśli potrzebujesz, możesz uruchomić inne programy z niestandardowymi zmiennymi środowiskowymi używając
env(1)
.Na przykład, wymazanie całego środowiska i ustawienie
Strange.Env:Var
na wartośćfoo
oraz wykonanie programu w Perlu, który je drukuje:wydrukuje
źródło