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 export
bearbeitet. 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 $TEST
hat bereits einen geeigneten Wert. Wenn Sie hello
einer Variablen zuweisen möchten, müssen TEST
Sie sagen TEST=hello
(Hinweis: Nein $
).
Danach habe ich es exportiert und echo
in 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 ~/.profile
Datei 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 ~/.profile
und diese Einstellungen geerbt hat.