Ich habe hier gelesen , dass der Zweck von export
in einer Shell ist, die Variable für Unterprozesse verfügbar zu machen, die von der Shell aus gestartet wurden.
Ich habe jedoch auch hier und hier gelesen , dass "Prozesse ihre Umgebung von ihren Eltern erben (dem Prozess, der sie gestartet hat)".
Wenn dies der Fall ist, warum brauchen wir export
? Was vermisse ich?
Sind Shell-Variablen standardmäßig nicht Teil der Umgebung? Was ist der Unterschied?
quelle
set -k
ist so, dass mancmd ENVVAR=value
anstelle von verwenden kannENVVAR=value cmd
, dass es in Ihrem Beispiel nur funktioniert, wennset -k
es vor dem Aufrufen ausgeführt wurdef
. Außerdem wird es heutzutage nicht mehr von vielen Shells unterstützt und nur aus Gründen der Abwärtskompatibilität mit der Bourne-Shell. In der Bourne- (oder Korn-) Shell würde das für Funktionen nicht funktionieren. Und da es die Shell-Analyse beeinflusst, muss es zu dem Zeitpunkt in Kraft sein, an dem die Shell den Code liest , der ihn dort verwendet.set -a
Es gibt einen Unterschied zwischen Shell-Variablen und Umgebungsvariablen. Wenn Sie eine Shell-Variable definieren, ohne
export
sie zu definieren, wird sie nicht zur Prozessumgebung hinzugefügt und somit nicht an ihre untergeordneten Elemente vererbt.Mit weisen
export
Sie die Shell an, die Shell-Variable der Umgebung hinzuzufügen. Sie können dies mit testenprintenv
(wobei nur die Umgebung gedruckt wirdstdout
, da dies ein untergeordneter Prozess ist, bei dem Sie die Auswirkung vonexport
Variablen sehen):quelle
Eine einmal exportierte Variable ist Teil der Umgebung.
PATH
wird in der Shell selbst exportiert, während benutzerdefinierte Variablen nach Bedarf exportiert werden können. Verwenden Sie einen Setup-Code:Vergleichen Sie
Mit
Da
foo
es von der Shell nicht exportiert undtest2.sh
nie exportiert wird, war essubshell.sh
im letzten Durchlauf nicht Teil der Umgebung von .quelle