Was ist die Verwendung des Befehls "export"?

12

Ich habe eine Umgebungsvariable in einem Terminalfenster erstellt und versucht, sie in einem anderen Terminalfenster wiederzugeben. Das zeigte nichts.

$TEST=hello

Danach habe ich es exportiert und echoin einem anderen Terminalfenster erneut versucht . Ergebnis war das gleiche wie zuvor.

export TEST 

Wenn ich jedoch beim Anmelden denselben Code ausführe (den Code an die ~/.profileDatei anhängen ), können Variablen in jedem Terminalfenster verwendet werden. Was passiert hier? Was ist der Unterschied zwischen der Ausführung eines Codes in einem Terminal und der Ausführung desselben beim Anmelden?

DScript
quelle

Antworten:

25

exportmacht eine Variable zu etwas, das in untergeordneten Prozessumgebungen enthalten sein wird. Andere bereits vorhandene Umgebungen sind davon nicht betroffen. Im Allgemeinen gibt es keine Möglichkeit, eine Variable in einem Terminal festzulegen und automatisch in einem anderen Terminal anzuzeigen. Die Umgebung wird für jeden Prozess für sich eingerichtet.

Wenn Sie es zu Ihrem hinzufügen, .profilewird es so eingerichtet, dass Ihre Umgebung bei jeder Anmeldung diese neue Variable enthält. Es wird also nicht von einer Shell in eine andere exportiert, sondern weist eine neue Shell an, sie beim Einrichten der ursprünglichen Umgebung einzuschließen.

Eric Renouf
quelle
1

Jeder Prozess verfügt über mehrere Attribute, die der Prozess einzeln und unabhängig von anderen Prozessen festlegen kann. Beispiele sind Ressourcenlimits, umask, aktuelles Verzeichnis, Umgebungsvariablen und einige mehr. Bei der Prozesserstellung (über den fork()Systemaufruf) erbt das Kind diese Attribute vom übergeordneten Element. Danach kann der untergeordnete Prozess diese Attribute beliebig festlegen. (Es gelten einige Einschränkungen. Ein Prozess erhöht möglicherweise nicht die Grenzwerte für harte Ressourcen und ändert sein aktuelles Verzeichnis nicht in ein Verzeichnis, für das er keine Ausführungsberechtigung hat.)

Nur wenige Programme ändern ihre Umgebungsvariablen, die meisten kümmern sich nicht darum. Angenommen, der letztere Fall. Wenn sich ein untergeordneter Prozess selbst weitere untergeordnete Prozesse erstellt, haben diese Prozesse dieselben Umgebungsvariablen wie die Großeltern. Und so weiter.

Jetzt hat eine Shell viele Variablen, mit denen sie angezeigt werden kann set(in Shells vom Typ Bourne Shell, keine Ahnung von C Shell). Diese Variablen sind keine Umgebungsvariablen, es sei denn, sie werden exportbearbeitet. Umgebungsvariablen können mit angezeigt werden env. Wenn Sie ein Programm über die Shell-Befehlszeile starten, erbt das Programm die Umgebungsvariablen von der Shell. Ebenso für ein Programm, das über ein Shell-Skript gestartet wurde.

Daher gibt es beim Anmelden eine Shell, die Profildaten (z. B. ~/.profile) liest und an praktisch alle Kinder, Enkelkinder usw. erbt. Auf diese Weise werden die Einstellungen für Umgebungsvariablen von der Anmeldeshell oder dem Anmeldeskript auf alle anderen Programme übertragen, die innerhalb der Anmeldesitzung gestartet werden.

Ich habe eine Umgebungsvariable in einem Terminalfenster erstellt und versucht, sie in einem anderen Terminalfenster wiederzugeben. Das zeigte nichts.

Nach der obigen Erklärung ist dies das erwartete Ergebnis. Änderungen in der Umgebung eines Prozesses betreffen nur untergeordnete Elemente dieses Prozesses, die fortan erstellt werden, nicht vorhandene.

$TEST=hello

Es ist unwahrscheinlich, dass dies funktioniert, es sei denn, die Variablenerweiterung ist deaktiviert oder $TESThat bereits einen geeigneten Wert. Wenn Sie helloeiner Variablen zuweisen möchten, müssen TESTSie sagen TEST=hello(Hinweis: Nein $).

Danach habe ich es exportiert und echoin einem anderen Terminalfenster erneut versucht . Ergebnis war das gleiche wie zuvor.

Dies ist erneut das erwartete Ergebnis.

Wenn ich jedoch beim Anmelden denselben Code ausführe (den Code an die ~/.profileDatei anhängen ), können Variablen in jedem Terminalfenster verwendet werden.

Dies liegt daran, dass die Shell im Terminal ein Nachkomme der Shell ist, die die Umgebungseinstellungen gelesen ~/.profileund diese Einstellungen geerbt hat.

Gegenmodus
quelle