Najbardziej przenośnym sposobem jest export -p
.
export -p
wyś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 -p
działa nawet w powłokach, które nie mają declare
wbudowanych, 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 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 jak declare -x
domyś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 grep
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 biegnij export -p
.
Przetestowałem te polecenia na Ubuntu 16.04 LTS z oficjalnie spakowanymi wersjami każdej powłoki.