Wie sehe ich eine Liste aller aktuell definierten Umgebungsvariablen in einem Linux-Bash-Terminal?

31

In einem Linux-Bash-Terminal sind oft viele Umgebungsvariablen wie $PATHund festgelegt $HOME.

Ist es möglich, alle Umgebungsvariablen anzuzeigen, die festgelegt wurden? Wie?

Cory Klein
quelle

Antworten:

32

TL; DR: verwenden(set -o posix ; set)


Laut Bash-Handbuch können Sie den seteingebauten Befehl verwenden, um alle Umgebungsvariablen anzuzeigen , die festgelegt wurden. Der setBefehl zeigt auch die Definitionen aller Funktionen an. Wenn Sie nur die Variablen und nicht die Funktionen anzeigen möchten, können Sie den POSIX-Modus aktivieren, bevor Sie den Befehl set ausführen. Der einfachste Weg, dies zu tun, ist mit set -o posix, aber der POSIX-Modus bleibt eingeschaltet, bis Sie ihn mit ausschalten set +o posix.

Daher zeigt der folgende Befehl alle definierten Umgebungsvariablen mithilfe einer Subshell an, ohne die POSIX-Kompatibilität in Ihrer aktuellen Shell zu beeinträchtigen.

(set -o posix ; set)

@RedGrittyBrick und @iglvzx schlugen vor, den envBefehl zu verwenden. Dieser Befehl enthält jedoch keine vollständige Liste der Umgebungsvariablen. envzeigt nur die Variablen an, die für den Export markiert wurden. Vergleichen Sie die Ausgabe von env | sortund export -pund Sie werden sehen, was ich meine. Sie können ausführen, comm -23 <(set -o posix; set) <(env|sort)wenn Sie sehen möchten, welche Umgebungsvariablen nicht exportiert werden.

Der Grund für die Diskrepanz ist, dass enves sich um eine separate ausführbare Datei sethandelt und nicht um einen in die Shell integrierten Befehl. Wenn ein Befehl ausgeführt wird, der kein in die Shell integrierter Befehl oder eine Funktion ist, empfängt er laut Bash-Handbuch nur Umgebungsvariablen, die für den Export in Bash markiert wurden . Es gibt viele Variablen, die nicht exportiert werden. Wenn Sie alle Variablen anzeigen möchten, die Ihre Shell definiert hat, müssen Sie den setBefehl wie im Handbuch angegeben verwenden.

Sie können dieses Verhalten mit den folgenden Befehlen einfach selbst testen.

MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE

Sie werden sehen, dass setdie Ausgabe erfolgt, während envdies nicht der Fall ist.

Seestern
quelle
24

Der envBefehl ohne Argumente gibt eine Liste der "exportierten" Umgebungsvariablen und ihrer Werte aus. Diese Variablen werden für Unterprozesse sichtbar gemacht - viele andere Umgebungsvariablen werden hier nicht angezeigt und nur in der laufenden Shell verwendet, z. B. zur Konfiguration.

RedGrittyBrick
quelle
10
Ich bevorzuge printenvda beide envund sethabe andere Funktionen als nur die Ausgabe der Umgebung.
Iglvzx
3
envdruckt nur eine Liste der Umgebungsvariablen, die für den Export markiert wurden. Es werden nicht alle Variablen gedruckt.
Seestern
4
@Starfish ist richtig - das heißt, diese akzeptierte Antwort war sehr falsch. Bearbeitet, um anzuzeigen, dass nur exportierte Variablen aufgelistet werden.
Volker Siegel
12
compgen -v

Gibt Shell-Variablen aus (aber nicht die Werte).

compgen -e

druckt exportierte Variablen, dh diejenigen, die von Prozessen geerbt werden, die diese Shell startet (aber nicht deren Werte).

Unterschied zwischen Shell- und exportierten Variablen: https://unix.stackexchange.com/questions/3507/differenz zwischen-Umgebungsvariablen-und-exportierten-Umgebungsvariablen-in-b ?rq=1

Evgeni Sergeev
quelle
compgen -eist genau das was ich wollte!
Hao