Jak wyświetlić wszystkie nazwy zmiennych i ich bieżące wartości?

348

Jak wyświetlić wszystkie nazwy zmiennych i ich bieżące wartości?

W tym nie tylko $HOME, $PWDetc, ale każdy inny już zdefiniowana.

Strapakowsky
źródło
3
superuser.com/questions/420295/…
Ciro Santilli 30 改造 中心 法轮功 六四 事件
Zaakceptowałeś niepoprawną odpowiedź. „printenv” daje tylko zmienne środowiskowe. Jeśli naprawdę chcesz, aby wszystkie zmienne aktualnie zadeklarowane w powłoce, użyj „deklaruj -p” lub „typeset -p”.
Florin Andrei

Odpowiedzi:

479

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 .

Lucio
źródło
14
Jeśli pójdę do terminala i piszę MYNEWVARIABLE=Ubuntui wykonuję printenv, nie pokazuje się tam. Dlaczego tak jest i jak pojawiają się inni?
Strapakowsky
4
Prawdopodobnie widzisz różnicę między zmienną powłoki a zmienną środowiskową. Spróbuj export MYNEWVARIABLE=Ubuntui będzie działać zgodnie z oczekiwaniami.
Rmano
3
jeśli po prostu wykonasz set, wyświetli również zmienną utworzoną przez ciebie. Albo zróbset | grep myvar
Sergiy Kolodyazhnyy
4
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.
Dan Pritts
1
Aby rozwinąć odpowiedź @ Rmano na @Strapakowsky ... To nie zadziała 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ć”.
Bruno Bronosky,
52

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:

  • uruchomić terminal
  • pokazać za pomocą zmiennych środowiskowych env, lub printenvczy cokolwiek

Problemem 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):

  • naciśnij Alt-F2
  • uruchom polecenie 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:

Przykład gołej skorupy

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 ...)

Rmano
źródło
Wymaga posiadania środowiska pulpitu, nieprzydatnego w przypadku serwerów z interfejsem CLI.
K7AAY
5
Tak --- ale dla CLI tylko poprzednia odpowiedź jest w porządku. Właśnie wskazałem, że czasami musisz sprawdzić zmienne środowiskowe dostępne dla aplikacji uruchomionej przez środowisko graficzne, co nie jest tym samym zestawem, który widzisz po uruchomieniu w nim terminala. Na przykład, jeśli próbujesz zrozumieć, dlaczego Twoja aplikacja Kile nie może skompilować pliku LaTeX, podczas gdy w terminalu możesz, sztuczka, którą tu zamieściłem, bardzo pomoże.
Rmano
3
Dzięki za bardzo przydatną odpowiedź! Właśnie podłączyłem
Gunnar Hjalmarsson
Dzięki. Czy poleciłeś, xterm -e bash --noprofile --norcponieważ pliki startowe nie są odczytywane i wykonywane po uruchomieniu Ubuntu z interfejsem graficznym? Zobacz askubuntu.com/q/1025845/1471
Tim
1
właściwe polecenie do wykonania w dzisiejszych czasach (Ubuntu 18.04) tognome-terminal -- bash --noprofile --norc
Mike Nakis
45

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.

geirha
źródło
Rozwiązanie to jest o wiele schludny-er niż POSIXLY_CORRECT=1 seti jest to również warto wspomnieć, że declarejest alias(w tym kontekście) dla typeset, innego wbudowanego polecenia bash.
1
To jest poprawna odpowiedź.
Florin Andrei
12

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.

rɑːdʒɑ
źródło
Zauważyłem, że env pomija niektóre zmienne o_O. w szczególności po uzyskaniu pliku VAR = VAL.
ThorSummoner,
1
@ThorSummoner Odpowiedź tutaj może pomóc stackoverflow.com/questions/15474650/…
georaldc
7

W bash przy użyciu compgen:

compgen -v | while read line; do echo $line=${!line};done  
tmgoblin
źródło
2
To powinna być zaakceptowana odpowiedź, ponieważ wszystkie inne wymieniają więcej niż tylko samą nazwę. W moim przypadku niektóre zmienne zawierają wartości wielowierszowe, co sprawia, że ​​inne rozwiązania są niewykonalne.
Mene
1
Wariant:compgen -v | while read line; do declare -p $line; done
Eljay,
4

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.

Ján Lalinský
źródło
1
Doskonała pierwsza odpowiedź! +1 Oby tak dalej!
Fabby
3

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

Ciro Santilli
źródło
Wspomniałem już dwa lata temu: askubuntu.com/a/276162/158442
mur
@muru wystarczy. Chciałbym, żeby stało się envbardziej widoczne dzięki lepszemu formatowaniu, a ja dodałem więcej informacji.
Ciro Santilli 30 改造 中心 法轮功 六四 事件
Po to jest edycja .
mur
2

Jeśli chcesz określoną zmienną środowiskową, zamiast drukować je wszystkie za pomocą printenv, możesz na przykład wydrukować ją wykonującecho "$PWD"

inigo333
źródło
0

printenv wyświetla tylko wyeksportowane zmienne, command+ alt+ $ („\ e $”: pełna-zmienna) wyświetla wszystkie zmienne.

użytkownik1133275
źródło