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)?
13
Odpowiedzi:
Jeśli chcesz zobaczyć, czy zmienna jest eksportowana, czy nie, użyj
declare
:źródło
Najbardziej przenośnym sposobem jest
export -p
.export -p
wyświetla wyeksportowane zmienne. Zwykle jest takdeclare -x
, jeśli twoja powłoka madeclare
.Aktualnie używane powłoki w stylu Bourne'a powinny obsługiwać
export -p
, ponieważ jest to wymagane przez POSIX :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 -p
działa nawet w powłokach, które nie majądeclare
wbudowanych, takich jak Dash .Przesłałem dane wyjściowe w celu
grep
uzyskania 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 -p
daje takie same dane wyjściowe jakdeclare -x
domyślnie.Zsh pokazuje niestandardowy format, nawet gdy włączona jest kompatybilność z POSIX:
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:Pamiętaj, że nie wszystkie wpisy muszą mieć
=
. Wynika to z faktu, że zmienne można rozbroić, ale eksportować. Te wpisy są odfiltrowywane przezgrep
powyż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 biegnijexport -p
.Przetestowałem te polecenia na Ubuntu 16.04 LTS z oficjalnie spakowanymi wersjami każdej powłoki.
źródło
Zmienne, które NIE są eksportowane, można zobaczyć na podstawie danych wyjściowych
declare
polecenia w bash.Zmienne, które są wywożone widać na wyjściu
declare -x
lubexport
polecenia w bash.źródło