Bash scheint zwischen exportierten und nicht exportierten Variablen zu unterscheiden.
Beispiel:
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
set
sieht die Variable aber env
nicht.
$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR
set
sieht beide Variablen außer env
sieht nur die exportierte Variable.
Ich kenne diesen set
ist eine eingebaute Bash und env
ist nicht.
Was sind die Unterschiede zwischen exportierten und nicht exportierten Variablen?
Akzeptierte Antwort:
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 lokal für den aktuellen Shell-Aufruf sind. Aus dem export
Manpage:
Die Shell soll den Variablen, die den spezifizierten Namen entsprechen, das Export-Attribut geben, was bewirkt, dass sie sich in der Umgebung von nachfolgend ausgeführten Befehlen befinden.
set
gibt die aktuelle Umgebung aus, die alle lokalen nicht exportierten Variablen enthält. env
wird verwendet, um Programme in einer neuen Umgebung zu starten, und gibt ohne Argumente aus, wie diese neue Umgebung aussehen würde. Da env
eine neue Umgebung erstellt, werden nur exportierte Variablen übertragen, wie dies bei jedem Programm der Fall ist, das von dieser Shell aus gestartet wird. Zum Beispiel das Spawnen einer zweiten Shell innerhalb der ersten (ich habe $$
verwendet um Eingabeaufforderungen in der inneren Shell darzustellen):
$ FOO=BAR
$ bash
$$ echo $FOO # Note the empty line
$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$
Beachten Sie, dass die Variable exportiert wird, nicht nur ihr Wert. Das bedeutet, sobald Sie export FOO
, FOO
wird eine globale Variable und taucht in nachfolgenden Umgebungen auf, auch wenn sie später geändert werden:
$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$