Umgebungsvariable vs Shell-Variable, was ist der Unterschied?

56

Jemand hat mir gesagt, dass:

BASH ist keine Umgebungsvariable, sondern eine Shell-Variable

Was ist der Unterschied?

Tom Brito
quelle
klingt so, als hätte das selbe ding nur einen anderen umfang?
Alexander Mills

Antworten:

35

$BASHist eine lokale Variable , die nur in der aktuellen (Bash-) Shell gültig ist.

Umgebungsvariablen wie $SHELLsind systemweit gültig. Zeigt in einer aktuellen Bash-Shell $BASHauf den Ausführungspfad von bash , während $SHELLauf die als Standard definierte Shell zeigt (die möglicherweise denselben Wert hat).

Eine Erläuterung der Umgebungsvariablen finden Sie Umgebungsvariablen in Ubuntu - Hilfe.

Takkat
quelle
1
Ein toller Link (+1) :)
Peter.O
12
Diese Antwort ist falsch / ungenau. Umgebungsvariablen sind NICHT global / systemweit. Shell-Variablen sind für die aktuell ausgeführte Shell privat und werden NICHT an untergeordnete Prozesse exportiert (weitergeleitet). Umgebungsvariablen werden in alle untergeordneten Prozesse exportiert. "MYVAR = privat; export OURVAR = freigegeben; printenv" würde nur "OURVAR" melden, da beim Ausführen des Befehls printenv OURVAR exportiert wird, nicht jedoch MYVAR.
CM
2
+1 zum Kommentar von CM! Ich habe den Unterschied noch nie so einfach und genau erklärt bekommen !!! Dieser Kommentar sollte die Antwort sein.
Jesse the Wind Wanderer
48

Eine Umgebungsvariable ist ein global verfügbares, in einem Programm und ihm untergeordnetes Programm. Eine Shell-Variable ist nur in der aktuellen Shell verfügbar. Verwenden Sie export VARNAME(ohne Dollar $), um eine Shell-Variable als Umgebungsvariable verfügbar zu machen .

Beispiele zur Verdeutlichung:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Eine andere Möglichkeit, eine Umgebungsvariable zu definieren:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE
Lekensteyn
quelle
Das halte ich nicht für richtig. exportlegt nicht unbedingt eine Umgebungsvariable fest. stackoverflow.com/questions/7411455/…
Chris Stryczynski
3
@ChrisStryczynski exportlegt eine Umgebungsvariable für untergeordnete Prozesse fest. Der von Ihnen verlinkte Beitrag widerspricht dieser Antwort nicht. Können Sie klären, warum Sie glauben, dass er falsch ist?
Lekensteyn
exportsetze unbedingt eine Umgebungsvariable
David Tonhofer 24.12.18
9

Da ist ein Unterschied. Shell-Variablen und Umgebungsvariablen erklären es besser, als ich es kann, aber hier ist ein Auszug daraus:

Wenn eine Änderung an einer Shell-Variablen vorgenommen wird, muss diese explizit in die entsprechende Umgebungsvariable "exportiert" werden, damit die Änderung in gegabelten Unterprozessen angezeigt wird. Denken Sie daran, dass Shell-Variablen lokal für die Shell sind, in der sie definiert wurden.

Peter.O
quelle
Ich kommentiere meine eigene Antwort. Ich mag den Link " Hilfe Ubuntu" in Takkats Antwort wirklich ... (besser als meiner)
Peter.O
3
Außerdem funktioniert dein Link nicht mehr!
1

Shell-Variable: Kurzfristig, Wird nur auf die aktuelle Instanz der Shell angewendet. Systemweit nicht anwendbar

Umgebungsvariable: Langzeitnutzung, systemweit gültig, global zulässig

Laut Konvention haben Shell-Variablen bei Envn ihren Namen als Kleinbuchstaben. Variablen werden in Großbuchstaben geschrieben

Ashish
quelle
-1

Um diese Frage zu beantworten, versuchen Sie zunächst, den Gültigkeitsbereich einer Variablen zu verstehen.

Wenn Sie eine neue Variable erstellen, wie SOME_ENV_VARIABLE="testing.txt"sie sich in der SHELL scopebefindet, bedeutet dies, dass auf diese von der Instanz der Shell zugegriffen werden kann , bei der der Benutzer angemeldet ist. Wenn sich die Instanz ändert, öffnen Sie zum Beispiel ein neues Terminal oder Sie ändern die Shell (zum Beispiel Sie) wechseln zu csh) Sie können nicht auf diese Variable zugreifen.

Wenn Sie diese Variable so exportieren, export SOME_ENV_VARIABLEdass sie jetzt im Umgebungsbereich verfügbar ist, bedeutet dies, dass Sie in diesem Fall, wenn Sie die Shell ändern, weiterhin auf diese Variable zugreifen können. Versuchen wir mit folgendem Beispiel zu verstehen:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Analogie: Nehmen wir an, Sie haben ein Apartment mit zwei Schlafzimmern und teilen es mit einem anderen Mitbewohner. Der Gemeinschaftsraum ist für jeden zugänglich, aber nicht für Ihre Schlafzimmer. Umgebungsvariablen sind wie Gemeinschaftsräume, und Shell-Variablen sind wie Schlafzimmer. Wenn Sie etwas im Gemeinschaftsraum haben, kann jeder darauf zugreifen, aber wenn Sie es in Ihrem Schlafzimmer aufbewahren, ist dies nur möglich von Ihnen zugegriffen werden.

Denken Sie daran, dass Sie beim Öffnen eines neuen Terminals nicht auf eine der Variablen zugreifen können, da Sie diese Instanz ändern . Fügen Sie dazu Ihre Variablen entweder in .profileoder hinzu .bashrc(wenn Sie bash verwenden).

Vishrant
quelle