Jak wyświetlić wszystkie nazwy zmiennych i ich bieżące wartości?
W tym nie tylko $HOME
, $PWD
etc, ale każdy inny już zdefiniowana.
Jak wyświetlić wszystkie nazwy zmiennych i ich bieżące wartości?
W tym nie tylko $HOME
, $PWD
etc, 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 printenv
stronę 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 zshoptions
stronie man .
MYNEWVARIABLE=Ubuntu
i wykonuję printenv
, nie pokazuje się tam. Dlaczego tak jest i jak pojawiają się inni?
export MYNEWVARIABLE=Ubuntu
i będzie działać zgodnie z oczekiwaniami.
set
, wyświetli również zmienną utworzoną przez ciebie. Albo zróbset | grep myvar
printenv
jest poleceniem zewnętrznym, więc wie tylko o (i drukuje) wyeksportowane zmienne środowiskowe. set
jest 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 MYNEW
i 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
printenv
czy 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 ~/.profile
lub .bashrc
lub .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ć env
tutaj, 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_environment
plik. Teraz znajdę to szybciej (a przy okazji mam nadzieję, że pomogę komuś innemu ...)
xterm -e bash --noprofile --norc
ponieważ 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 declare
wbudowanym.
declare -p
Jeśli interesują Cię tylko zmienne środowiskowe, użyj
declare -xp
Uruchom, help declare
aby zobaczyć inne opcje.
POSIXLY_CORRECT=1 set
i jest to również warto wspomnieć, że declare
jest 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ć env
polecenia.
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
env
bardziej 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.