Linux: Wo werden Umgebungsvariablen gespeichert?

77

Wenn ich in ein Terminal tippe,

export DISPLAY=:0.0

... wo speichert die Shell diese Umgebungsvariable?

Ich benutze Ubuntu 8.10. Ich habe in den Dateien ~ / .profile und / etc / profile nachgesehen und kann keine Spur von DISPLAY finden.

Ben L.
quelle
Wo im Speicher: unix.stackexchange.com/questions/75939/…
Ciro Santilli 法轮功 冠状 病 六四 事件 18

Antworten:

113

Die Umgebungsvariablen eines Prozesses sind zur Laufzeit vorhanden und werden in keiner Datei oder so gespeichert. Sie werden im eigenen Speicher des Prozesses gespeichert (dort werden sie an Kinder weitergegeben). Es befindet sich jedoch eine virtuelle Datei in

/ proc / pid / environ

Diese Datei zeigt alle Umgebungsvariablen an, die beim Aufrufen des Prozesses übergeben wurden (es sei denn, der Prozess hat diesen Teil seines Speichers überschrieben - die meisten Programme tun dies nicht). Der Kernel macht sie durch diese virtuelle Datei sichtbar. Man kann sie auflisten. Zum Beispiel kann man die Variablen des Prozesses 3940 anzeigen

cat /proc/3940/environ | tr '\0' '\n'

Jede Variable wird durch eine binäre Null von der nächsten begrenzt. tr ersetzt die Null in eine neue Zeile.

Johannes Schaub - litb
quelle
11
Der Kernel speichert die Umgebungsvariablen nicht, sondern im Benutzermodus. / proc / <pid> / environ gibt möglicherweise die falschen Werte zurück, wenn der Umgebungsblock neu zugewiesen wurde.
Atomice
1
@atomice Ich hatte den Eindruck, dass der Kernel sie speichert und für Benutzerprogramme sichtbar macht, die für Benutzerprogramme beschreibbar sind. Stellt die environDatei die falschen Werte dar, wenn eine Umgebungsvariable auf definierte Weise geändert wurde? Können Sie vielleicht ein Programm zeigen, das das ausnutzt?
Johannes Schaub - litb
14
Der Kernel speichert sie an einem bestimmten Ort im Benutzerbereich, und genau das macht / proc / <pid> / environ verfügbar. Wenn Sie jedoch die Umgebung in einem Programm mit putenv oder setenv ändern, wird der anfängliche Umgebungsblock möglicherweise neu zugewiesen (um die neue Variable aufzunehmen). Die neuen Variablen werden in der Ausgabe von / proc / <pid> / environ nicht angezeigt.
Atomice
1
@atomice Also, wo wird die neue aktualisierte Umgebung bleiben? Welcher Befehl soll es zeigen?
user2431763
1
@atomice: an welcher virtuellen adresse werden sie dann gespeichert? Es ist im Fall von x86_64.
user2284570
41

Geben Sie "set" ein und Sie erhalten eine Liste aller aktuellen Variablen. Wenn Sie möchten, dass etwas bestehen bleibt, geben Sie es in ~ / .bashrc oder ~ / .bash_profile ein (wenn Sie bash verwenden).

tddmonkey
quelle
15

Wenn Sie die Umgebung systemweit nutzen möchten, können Sie dies mit /etc/environmentDatei tun .

JohnnyQ
quelle
Die Frage ist, wo in ʀᴀᴍ.
user2284570
8
@ user2284570 wo in der Frage angegeben, dass? Können Sie bitte näher darauf eingehen?
JohnnyQ
8

Es wird im Prozess (Shell) gespeichert, und seit Sie es exportiert haben, werden alle Prozesse, die verarbeitet werden, erzeugt.

Wenn Sie dies tun, wird es nirgendwo im Dateisystem wie / etc / profile gespeichert. Sie müssen es explizit dort platzieren, damit dies geschieht.

Cletus
quelle
-8

Diese Variable ist in keinem Skript gespeichert. Es wird einfach durch die X-Server-Skripte festgelegt. Sie können die aktuell eingestellten Umgebungsvariablen mit set überprüfen .

Eduard - Gabriel Munteanu
quelle
Tatsächlich wird es von der Shell für die X-Clients festgelegt.
Paxdiablo
Natürlich wird es durch die Skripte festgelegt, die den X-Server hochfahren.
Eduard - Gabriel Munteanu