W terminalu bash dla Linuksa często ustawianych jest wiele zmiennych środowiskowych, takich jak $PATH
i $HOME
.
Czy można zobaczyć wszystkie ustawione zmienne środowiskowe? W jaki sposób?
W terminalu bash dla Linuksa często ustawianych jest wiele zmiennych środowiskowych, takich jak $PATH
i $HOME
.
Czy można zobaczyć wszystkie ustawione zmienne środowiskowe? W jaki sposób?
Odpowiedzi:
TL; DR: użyj(set -o posix ; set)
Zgodnie z instrukcją Bash możesz użyć set
wbudowanej komendy, aby wyświetlić wszystkie ustawione zmienne środowiskowe . set
Komenda będzie również wyświetlać definicje żadnej funkcji. Jeśli chcesz zobaczyć tylko zmienne, a nie funkcje, możesz włączyć tryb POSIX przed uruchomieniem polecenia set. Najłatwiej to zrobić za pomocą set -o posix
, ale pozostawi włączony tryb POSIX, dopóki go nie wyłączyszset +o posix
.
Dlatego poniższe polecenie pokaże wszystkie zdefiniowane zmienne środowiskowe za pomocą podpowłoki bez wpływu na zgodność z POSIX w bieżącej powłoce.
(set -o posix ; set)
@RedGrittyBrick i @iglvzx zasugerowały użycie env
polecenia, jednak to polecenie nie zapewni pełnej listy zmiennych środowiskowych. env
pokaże tylko zmienne oznaczone do eksportu. Porównaj wyniki env | sort
i export -p
zobaczysz, co mam na myśli. Możesz uruchomić, comm -23 <(set -o posix; set) <(env|sort)
jeśli chcesz zobaczyć, które zmienne środowiskowe nie są eksportowane.
Przyczyną rozbieżności jest to, że env
jest to osobny plik wykonywalny, w przeciwieństwie do set
wbudowanego polecenia powłoki. Zgodnie z instrukcją Bash, gdy zostanie wykonane polecenie, które nie jest wbudowanym poleceniem lub funkcją powłoki, otrzyma tylko zmienne środowiskowe, które zostały oznaczone do eksportu w Bash . Istnieje wiele zmiennych, które nie są eksportowane. Dlatego jeśli chcesz zobaczyć wszystkie zmienne zdefiniowane przez twoją powłokę, musisz użyćset
polecenia podanego w instrukcji.
Możesz łatwo przetestować to zachowanie, korzystając z następujących poleceń.
MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE
Zobaczysz, że set
zapewnia wyjście, podczas gdy env
nie.
env
Polecenia bez argumentów wypisze listę „eksportowanych” zmiennych środowiskowych i ich wartości. Te zmienne są widoczne dla podprocesów - wiele innych zmiennych środowiskowych nie jest z tym pokazanych i są używane tylko wewnątrz działającej powłoki, np. Do konfiguracji.
printenv
, gdyż obie env
i set
mieć inne funkcje niż tylko wyprowadzanie środowiska.
env
wypisze tylko listę zmiennych środowiskowych, które zostały oznaczone do eksportu. Nie wydrukuje wszystkich zmiennych.
compgen -v
wypisuje zmienne powłoki (ale nie wartości).
compgen -e
wypisuje wyeksportowane zmienne, tj. dziedziczone przez procesy uruchamiane przez tę powłokę (ale nie ich wartości).
Różnica między zmiennymi powłoki a eksportowanymi zmiennymi: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1
compgen -e
jest dokładnie tym, czego chciałem!