Unterschied zwischen exportierten und nicht in bash enthaltenen Shell-Variablen

41

Bash scheint zwischen exportierten und nicht exportierten Variablen zu unterscheiden.

Beispiel:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

setsieht die Variable aber envnicht.

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

setsieht beide Variablen, envsieht aber nur die exportierte Variable.

Ich weiß, dass dies seteine eingebaute Bash ist und envnicht.

Was sind die Unterschiede zwischen exportierten und nicht exportierten Variablen?

Lesmana
quelle
17
Terminologie-Hinweis: Eine "Umgebungsvariable" wird immer exportiert. Eine nicht exportierte Variable ist eine „Shell-Variable“ (oder ein „Parameter“).
Gilles 'SO- hör auf böse zu sein'

Antworten:

44

Exportierte Variablen werden in die Umgebung von Befehlen übertragen, die von der Shell ausgeführt werden, die sie exportiert hat, während nicht exportierte Variablen für den aktuellen Shell-Aufruf lokal sind. Von der exportManpage:

Die Shell muss den Variablen, die den angegebenen Namen entsprechen, das Exportattribut geben, wodurch sie sich in der Umgebung von nachfolgend ausgeführten Befehlen befinden.

setgibt die aktuelle Umgebung aus, die alle lokalen nicht exportierten Variablen enthält. envwird verwendet, um Programme in einer neuen Umgebung zu starten. Ohne Argumente wird ausgegeben, wie diese neue Umgebung aussehen würde. Da enveine neue Umgebung erstellt wird, werden nur exportierte Variablen durchgelassen, wie dies bei jedem Programm der Fall ist, das von dieser Shell aus gestartet wird. Zum Beispiel, eine zweite Shell innerhalb der ersten $$zu erzeugen (ich habe Eingabeaufforderungen in der inneren Shell dargestellt):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

Beachten Sie, dass die Variable exportiert wird und nicht nur der Wert. Dies bedeutet , dass , wenn Sie export FOO, FOOeine globale Variable und zeigt sich in den folgenden Umgebungen wird, auch wenn später geändert:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$
Michael Mrozek
quelle
Müssen Sie also exportieren, wenn Sie nur über die aktuelle Shell besorgt sind? Separat, warum werden localefür die aktuelle Shell die Updates nicht angezeigt?
Pacerier