Jak ustalić, czy zmienne powłoki są eksportowane, czy nie?


13

W rodzinie powłok Bourne wszystkie zmienne powłoki mają nazwy pisane dużymi literami; co oznacza, że ​​nie można stwierdzić, czy dana zmienna jest zmienną środowiskową, czy nie tylko na podstawie jej nazwy. Jak określić, które zmienne powłoki Bourne'a są lokalne (zdefiniowane tylko w bieżącej powłoce)?


4
Skorupa Bourne'a czy Skorupa Bourne'a? Czy możesz wskazać odwołanie do zmiennej wielkiej litery?
Jeff Schaller

W powłoce Bourne-again, ponieważ wszystkie zmienne są pisane wielkimi literami, jak możesz określić, które zmienne bash są lokalne?
Shoulderpadz

7
@Shoulderpadz nic nie stoi na przeszkodzie, aby tworzyć zmienne pisane małymi literami.
muru

1
Przez lokalny rozumiesz zmienne, które nie zostały wyeksportowane?
Eliah Kagan,

4
Różnica, o którą pytasz, to zmienne powłoki vs zmienne środowiskowe, a nie globalne vs lokalne. Zauważ, że istnieją zmienne powłoki, które nie są zmiennymi środowiskowymi (tj. Tak zwane „lokalne”), i istnieją zmienne środowiska, które nie są zmiennymi powłoki (środowisko może zawierać nazwy, które nie są prawidłowymi identyfikatorami powłoki, a zatem nie mogą być zmiennymi).
chepner

Odpowiedzi:


17

Jeśli chcesz zobaczyć, czy zmienna jest eksportowana, czy nie, użyj declare:

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

26

Najbardziej przenośnym sposobem jest export -p.

export -pwyświetla wyeksportowane zmienne. Zwykle jest tak declare -x, jeśli twoja powłoka ma declare.

Aktualnie używane powłoki w stylu Bourne'a powinny obsługiwać export -p, ponieważ jest to wymagane przez POSIX :

Gdy podano -p , eksport wypisze na standardowe wyjście nazwy i wartości wszystkich eksportowanych zmiennych, w następującym formacie:

"export %s=%s\n", <name>, <value>

jeśli nazwa jest ustawiona i:

"export %s\n", <name>

jeśli nazwa nie jest ustawiona

Norma wyjaśnia dalej, że wartość zmiennej jest wyświetlana w taki sposób, że zwykle pozwala na użycie jej później po prawej stronie =w przypisaniu. To znaczy, że można ją zacytować. Różne muszle mogą wyświetlać je inaczej, ale z tym samym efektem. export -pdziała nawet w powłokach, które nie mają declarewbudowanych, takich jak Dash .

$ dash -c 'export -p | grep HOME='  # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME='  # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek

Przesłałem dane wyjściowe w celu grepuzyskania zwartości, ale jeśli go nie przefiltrujesz, otrzymasz pełną listę eksportowanych zmiennych. Z twojego pytania wynika, że ​​to może być najbardziej przydatne.

Niektóre powłoki, takie jak Bash, używają niestandardowego formatu, chyba że wyraźnie polecono, aby zachowywały się w sposób zgodny z POSIX. W Bash export -pdaje takie same dane wyjściowe jak declare -xdomyślnie.

$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME='  # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"

Zsh pokazuje niestandardowy format, nawet gdy włączona jest kompatybilność z POSIX:

$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek

W każdym razie możesz wyodrębnić przenośne reprezentacje (które można zacytować), wyszukując słowo, po którym następuje =. Nie opiera się to na poprzednich słowach w wierszu, o ile nie poprzedzają one od razu =, czego nie powinny. Na przykład:

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

Pamiętaj, że nie wszystkie wpisy muszą mieć =. Wynika to z faktu, że zmienne można rozbroić, ale eksportować. Te wpisy są odfiltrowywane przez greppowyższe polecenie, które może, ale nie musi być tym, czego chcesz.

Przez większość czasu, po prostu chcesz sprawdzić wydajność i tak nie obchodzi, jeśli wpisy są poprzedzane export, declare -x, typeset -x, lub coś innego. Więc po prostu biegnij export -p.

Przetestowałem te polecenia na Ubuntu 16.04 LTS z oficjalnie spakowanymi wersjami każdej powłoki.


0

Zmienne, które NIE są eksportowane, można zobaczyć na podstawie danych wyjściowych declarepolecenia w bash.

Zmienne, które wywożone widać na wyjściu declare -xlub exportpolecenia w bash.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.