Unterschied zwischen Umgebungsvariable und Shell-Variable

8

Es wird gesagt, dass Umgebungsvariablen in untergeordneten Prozessen vererbt werden, Shell-Variablen jedoch nicht. Der folgende Test zeigt jedoch, dass Shell-Variablen im untergeordneten Prozess genauso wie Umgebungsvariablen angezeigt werden. Was ist der Unterschied?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST
ning
quelle

Antworten:

9

Ihre zweite Zuweisung TEST="SHELL_TEST"hebt den Export der Variablen nicht auf. Es ist immer noch als "von Kindern geerbt werden" markiert. Der vom Kind geerbte Wert ist der aktuell im übergeordneten Wert festgelegte Wert.
Mit anderen Worten, Ihre zweite Zuweisung setzt den Status TESTeiner Shell-Variablen nicht zurück, sondern ist nach dieser Terminologie immer noch eine Umgebungsvariable.

Sie müssten den Export aufheben, damit er in untergeordneten Prozessen nicht mehr festgelegt wird:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$
Matte
quelle
Hallo Mat, danke für deine Antwort. Mein Verständnis (es gibt zwei Variablen mit dem Namen TEST, eine für die Umgebungsvariable und eine für die Shell-Variable, Shell-Var-TEST-Schatten env var TEST) ist falsch. Es gibt nur eine Variable in Bash, es ist immer eine Shell-Variable und kann es sein Wird exportiert und fungiert als Umgebungsvariable. Ist dies spezifisch für Bash und implementierungsabhängig oder ist es in allen Shells universell? Vielen Dank.
ning
Ich bin mir nicht sicher über "universal", aber es funktioniert genauso mit bash, ksh und zsh.
Mat
2
@ning So funktionieren alle modernen POSIX / Bourne-Shells (ash, ksh, bash, zsh). Es gab alte Versionen der Bourne-Shell, bei denen das Ändern einer exportierten Shell-Variablen den Wert in der Umgebung nicht änderte, aber es ist unwahrscheinlich, dass Sie ihnen mehr begegnen. Csh funktioniert anders, das kann in altmodischen Umgebungen immer noch vorkommen, aber es ist auch schon eine Weile veraltet.
Gilles 'SO - hör auf böse zu sein'
@ Gilles Vielen Dank, dass Sie klargestellt haben, was los ist und warum. Wie jemand sagte, sollte jeder Unix-Entwickler auch ein Historiker sein.
ning