Unterschied zwischen "a = b" und "export a = b" in bash

50

Was ist der Unterschied zwischen:

a=b

und

export a=b

In Bash?

Ich verstehe, dass beide Umgebungsvariablen definieren, aber ich verstehe den Unterschied nicht vollständig.

Adam Matan
quelle
Könnte jemand das bitte bearbeiten? Dies hat überhaupt nichts mit Linux zu tun, sondern hängt nur von der verwendeten Shell ab. Ich denke es ist bash hier, was auch unter Windows funktioniert.
Uhr
Ich stehe korrigiert.
Adam Matan

Antworten:

54

export Leitet die Variable an Unterprozesse weiter.

Zum Beispiel, wenn Sie es getan haben

FOO=bar

dann würde ein auf FOO überprüfter Unterprozess die Variable while nicht finden

export FOO=bar

würde es dem Unterprozess ermöglichen, es zu finden.

Wenn dies FOOjedoch bereits als Umgebungsvariable definiert wurde, FOO=barwird der Wert dieser Umgebungsvariablen geändert.

Zum Beispiel:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Ältere Shells unterstützten die export FOO=barSyntax nicht. Sie hatte zu schreiben FOO=bar; export FOO.

Mike McQuaid
quelle
33
Wenn Sie " export" nicht verwenden , definieren Sie keine Umgebungsvariable, sondern nur eine Shell-Variable. Shell-Variablen stehen nur dem Shell-Prozess zur Verfügung. Umgebungsvariablen stehen für jeden nachfolgenden Prozess zur Verfügung, nicht nur für Shells. Subshells sind außerdem Befehle in Klammern, die Zugriff auf Shell-Variablen haben, während Sie von untergeordneten Prozessen sprechen, die zufällig Shells sind.
Wfaulk
Wo werden diese aufbewahrt?
HDave
28

Wenn Sie nicht verwenden export, definieren Sie keine Umgebungsvariable. nur eine Shell-Variable.

Shell-Variablen stehen nur dem Shell-Prozess zur Verfügung. Umgebungsvariablen stehen für jeden nachfolgenden Prozess zur Verfügung, nicht nur für Shells.

wfaulk
quelle
2

Wenn Sie möchten, dass die Variable für die aufrufende Shell verfügbar ist, ohne den Export zu verwenden, können Sie Folgendes tun:

Die Datei a.ksh lautet -

#!/bin/ksh
FOO=bar

Führen Sie dies an der Eingabeaufforderung aus

> . a.ksh

Dadurch werden die Befehle in derselben Shell ausgeführt und $ FOO ist verfügbar.

Wohingegen,

> a.ksh

Wird $ FOO nur innerhalb von a.ksh verfügbar machen, nach dem Aufruf von a.ksh würde es nicht existieren.

alok
quelle
1
Richtig. Beachten Sie, dass "." ist nur eine Abkürzung für "Quelle", die manchmal in Skripten zur besseren Lesbarkeit verwendet wird. Siehe "Hilfe". oder "Hilfequelle" für Details.
sleske
1

Zusätzlich zu dem, was bereits beantwortet wurde, definieren diese beiden Anweisungen nicht notwendigerweise eine Umgebungsvariable (dh create vs set), da "a" möglicherweise bereits als Shell- oder Umgebungsvariable vorhanden ist.

Im letzteren Fall sind beide Aussagen absolut gleichwertig.

jlliagre
quelle