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

$TEST=hello 

Danach habe ich es exportiert und erneut versucht, es in einem anderen Terminalfenster echo . Das Ergebnis war das gleiche wie zuvor.

export TEST 

, aber wenn ich beim Anmelden denselben Code ausführe (den Code an ~/.profile file) Variablen können 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?

Antwort

export macht 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 einzeln eingerichtet.

Hinzufügen zu Ihrer .profile bewirkt, dass Ihre Umgebung so eingerichtet wird, dass sie diese neue Variable bei jeder Anmeldung enthält. Sie wird also nicht von einer Shell in eine andere exportiert, sondern weist stattdessen eine neue Shell an, diese einzuschließen Dies gilt, wenn die anfängliche Umgebung eingerichtet wird.

Antwort

Jeder Prozess verfügt über mehrere Attribute, die der Prozess einzeln und unabhängig festlegen kann andere Prozesse. Beispiele sind Ressourcenlimits, umask, aktuelles Verzeichnis, Umgebungsvariablen und einige mehr. Bei der Prozesserstellung (über den Systemaufruf fork()) erbt das Kind diese Attribute vom übergeordneten Element. Danach kann der untergeordnete Prozess diese Attribute beliebig festlegen. (Es gelten einige Einschränkungen. Möglicherweise erhöht ein Prozess die Grenzwerte für harte Ressourcen nicht 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 stören sich nicht Nehmen wir den letzteren Fall an. Wenn also ein untergeordneter Prozess weitere untergeordnete Prozesse erstellt, haben diese Prozesse dieselben Umgebungsvariablen wie die Großeltern. Und so weiter.

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

Daher gibt es beim Anmelden eine Shell, die Profildaten liest (z. B. ~/.profile) und erbt sie an praktisch alle Kinder, Enkelkinder und so weiter. 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 wurden.

Ich habe eine Umgebungsvariable in erstellt ein Terminalfenster und versuchte, es in einem anderen Terminalfenster wiederzugeben. Das zeigte nichts an.

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

$TEST=hello

Dies ist ohnehin unwahrscheinlich, es sei denn, die Variablenerweiterung ist deaktiviert oder $TEST hat bereits eine geeigneter Wert. Wenn Sie hello der Variablen TEST zuweisen möchten, müssen Sie TEST=hello sagen (Hinweis : no $).

Danach habe ich es exportiert und erneut versucht, echo in einem anderen Terminalfenster. Das 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 Datei ~/.profile 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 von ~/.profile gelesen und diese Einstellungen geerbt hat.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.