Jak wyświetlić wszystkie nazwy zmiennych i ich bieżące wartości?
W tym nie tylko $HOME, $PWDetc, ale każdy inny już zdefiniowana.
Jak wyświetlić wszystkie nazwy zmiennych i ich bieżące wartości?
W tym nie tylko $HOME, $PWDetc, ale każdy inny już zdefiniowana.
Odpowiedzi:
Dla bash: (standardowa powłoka w Ubuntu)
Wpisz następujące polecenie w terminalu, aby wydrukować wszystkie zmienne środowiskowe:
printenv
Aby uzyskać więcej informacji na temat tego polecenia, przeczytaj printenvstronę podręcznika man .
Aby wyświetlić listę zawierającą „zmienne powłoki”, możesz wprowadzić następną komendę:
( set -o posix ; set ) | less
To pokaże nie tylko zmienne powłoki, ale także zmienne środowiskowe.
Aby uzyskać więcej informacji związanych z tym tematem, przeczytaj:
Dla zsh: (zaawansowana powłoka)
Użyj następującego polecenia:
( setopt posixbuiltin; set; ) | less
Więcej informacji o opcjach ZSH znajduje się na zshoptionsstronie man .
MYNEWVARIABLE=Ubuntui wykonuję printenv, nie pokazuje się tam. Dlaczego tak jest i jak pojawiają się inni?
export MYNEWVARIABLE=Ubuntui będzie działać zgodnie z oczekiwaniami.
set, wyświetli również zmienną utworzoną przez ciebie. Albo zróbset | grep myvar
printenvjest poleceniem zewnętrznym, więc wie tylko o (i drukuje) wyeksportowane zmienne środowiskowe. setjest wewnętrzną komendą bash, więc pokazuje wszystkie „zmienne powłoki” (niewymportowane zmienne środowiskowe), a także wyeksportowane zmienne środowiskowe.
unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, ale będzie unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWi tak będzie unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. Korzystanie z eksportu mówi: „zmienna, którą ustawiam, powinna być częścią środowiska przekazywanego do procesów, a nie tylko zmienną w tej powłoce”. Mój trzeci przykład mówi: „zmienna powinna być częścią środowiska, która jest przekazywana do TEGO procesu, ale nie powinna się później zmieniać”.
Wiem, że to pytanie jest dość stare i odpowiedziałem, ale myślę, że mogę dodać trochę przydatnych informacji.
We wszystkich opisanych wyżej metodach sugerowana procedura to:
env, lub
printenvczy cokolwiekProblemem tych rozwiązań jest to, że widzisz zmienne środowiskowe powłoki, która działa na terminalu . Nie widzisz zmiennych środowiskowych dostępnych dla aplikacji, na przykład bezpośrednio przez interfejs graficzny.
Jest to zauważalne, jeśli na przykład używasz własnych ~/.profilelub .bashrclub .zshenv(w zależności od powłoki) do modyfikowania zmiennych środowiskowych - takich jak klasyczny dodatek katalogów do ścieżki.
Aby zobaczyć zmienne środowiskowe dostępne dla aplikacji uruchomione bezpośrednio w środowisku graficznym, możesz wykonać następujące czynności (jestem pewien, że w Gnome Shell istnieje równoważna metoda we wszystkich innych DE):
xterm -e bash --noprofile --norc(Lub, jeśli nie masz xterm, gnome-terminal -- bash --noprofile --norc--- dzięki @Mike Nakis za komentarz).
Masz teraz terminal z powłoką, która nie dodała żadnych zmiennych środowiskowych. Możesz użyć envtutaj, aby wyświetlić listę wszystkich zmiennych środowiskowych:

Oczywiście nowa powłoka będzie miała zmienne środowiskowe dodane przez pliki systemowe, ale te zmienne powinny być dostępne (przez dziedziczenie) dla wszystkich programów w systemie.
Publikuję to, ponieważ po raz czwarty muszę ponownie przeszukać tę sztuczkę, sprawdzając mój .pam_environmentplik. Teraz znajdę to szybciej (a przy okazji mam nadzieję, że pomogę komuś innemu ...)
xterm -e bash --noprofile --norcponieważ pliki startowe nie są odczytywane i wykonywane po uruchomieniu Ubuntu z interfejsem graficznym? Zobacz askubuntu.com/q/1025845/1471
gnome-terminal -- bash --noprofile --norc
Możesz zobaczyć wszystkie zmienne z declarewbudowanym.
declare -p
Jeśli interesują Cię tylko zmienne środowiskowe, użyj
declare -xp
Uruchom, help declareaby zobaczyć inne opcje.
POSIXLY_CORRECT=1 seti jest to również warto wspomnieć, że declarejest alias(w tym kontekście) dla typeset, innego wbudowanego polecenia bash.
Aby wyświetlić listę zmiennych środowiskowych w terminalu za pomocą CTRL+ ALT+ T, możesz użyć envpolecenia.
na przykład :
[raja@localhost ~]$ env
XDG_VTNR=1
SSH_AGENT_PID=3671
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/home/raja/.gnupg/S.gpg-agent:3691:1
GLADE_PIXMAP_PATH=:
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=xfce-
DESKTOP_STARTUP_ID=
HISTSIZE=1000
XDG_SESSION_COOKIE=0250277dd805498381e96c05d88068b0-1364679772.845276-1676152201
WINDOWID=65011716
GNOME_KEYRING_CONTROL=/home/raja/.cache/keyring-N3QoQ2
IMSETTINGS_MODULE=none
QT_GRAPHICSSYSTEM_CHECKED=1
USER=raja
itp.
mam nadzieję, że to pomaga.
W bash przy użyciu compgen:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
Większość rozwiązań tutaj albo drukuje tylko zmienne środowiskowe, albo ma tę wadę, że env lub (set -o posix; posix) nie drukują wartości w postaci możliwej do przeanalizowania (spróbuj wydrukować zmienną A = $ 'a \ r \ nb' ...) .
Oto funkcja, która wypisze wszystkie zmienne, jedną zmienną na wiersz, w postaci zmiany znaczenia POSIX:
function dump_vars {
local VARNAME
compgen -v | while read -r VARNAME; do
printf "$VARNAME=%q\n" "${!VARNAME}"
done
}
Dzięki @tmgoblin za wskazanie użycia compgen -v.
env to POSIX 7 sposób :
export asdf=qwer
env | grep asdf
Przykładowe dane wyjściowe:
asdf=qwer
Pokazuje tylko wyeksportowane zmienne: nieeksportowane zmienne zwykle nie są uważane za „zmienne środowiskowe”.
Wolę to printenv, co nie jest POSIX. Oba wydają się robić to samo bez argumentów: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv
envbardziej widoczne dzięki lepszemu formatowaniu, a ja dodałem więcej informacji.
printenv wyświetla tylko wyeksportowane zmienne, command+ alt+ $ („\ e $”: pełna-zmienna) wyświetla wszystkie zmienne.