In einem Linux-Bash-Terminal sind oft viele Umgebungsvariablen wie $PATH
und festgelegt $HOME
.
Ist es möglich, alle Umgebungsvariablen anzuzeigen, die festgelegt wurden? Wie?
In einem Linux-Bash-Terminal sind oft viele Umgebungsvariablen wie $PATH
und festgelegt $HOME
.
Ist es möglich, alle Umgebungsvariablen anzuzeigen, die festgelegt wurden? Wie?
Antworten:
TL; DR: verwenden(set -o posix ; set)
Laut Bash-Handbuch können Sie den set
eingebauten Befehl verwenden, um alle Umgebungsvariablen anzuzeigen , die festgelegt wurden. Der set
Befehl 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 env
Befehl zu verwenden. Dieser Befehl enthält jedoch keine vollständige Liste der Umgebungsvariablen. env
zeigt nur die Variablen an, die für den Export markiert wurden. Vergleichen Sie die Ausgabe von env | sort
und export -p
und 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 env
es sich um eine separate ausführbare Datei set
handelt 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 set
Befehl 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 set
die Ausgabe erfolgt, während env
dies nicht der Fall ist.
Der env
Befehl 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.
printenv
da beide env
und set
habe andere Funktionen als nur die Ausgabe der Umgebung.
env
druckt nur eine Liste der Umgebungsvariablen, die für den Export markiert wurden. Es werden nicht alle Variablen gedruckt.
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
compgen -e
ist genau das was ich wollte!