Wenn wir eine Variable in ~/.profile
Ubuntu ändern , führen wir den Befehl aus source .profile
. Dann ist die Änderung nur in diesem Terminal wirksam . Wenn wir ein neues Terminal öffnen, müssen wir den Befehl source .profile
erneut ausführen . Es scheint also, dass verschiedene Terminals ihre eigene Umgebung haben, obwohl sie möglicherweise demselben Benutzer gehören.
Was ist der Vorteil, wenn jedes Terminal seinen eigenen Umgebungspfad hat? Es scheint besser zu sein, wenn verschiedene Terminals, die demselben Benutzer gehörten, dieselbe Umgebungsvariable gemeinsam nutzen würden.
environment-variables
.profile
cainiaofei
quelle
quelle
Antworten:
Der Grund dafür ist, dass
~/.profile
nur Login-Shells verwendet werden. Wenn Sie ein neues Terminalfenster öffnen, ist die gestartete Shell standardmäßig eine Nicht-Login-Shell. Wenn Sie sich abmelden und wieder anmelden, wird die Änderung an~/.profile
in allen Ihren Terminals wirksam, da sie~/.profile
beim Anmelden bei Ihrer Sitzung bezogen wird.Es ist nicht so, dass verschiedene Terminalfenster eine unterschiedliche Umgebung haben, sondern dass die Beschaffung
~/.profile
nur~/.profile
in der aktuellen Shell ausgeführt wird (genau dassource
tut der Befehl).Im Gegensatz dazu wirkt sich eine Änderung von
~/.bashrc
sofort auf jedes neue Terminalfenster aus, das Sie öffnen, oder auf jede Bash-Shell, die Sie mit der Eingabe beginnenbash
, da sie von allen interaktiven Bash-Shells bezogen wird.quelle
Umgebungsvariablen dienen nicht nur den Benutzereinstellungen. Sie sind ein generischer Mechanismus für die Übermittlung einer Vielzahl von Einstellungsinformationen von einem übergeordneten Prozess an untergeordnete Prozesse, die gestartet werden.
Es gibt zahlreiche Fälle, in denen ein Prozess bestimmte Umgebungsvariablen festlegt, um nur die Prozesse zu beeinflussen , die er startet. Beispielsweise kann ein Skript die Gebietsschemaeinstellungen für Befehle, die es startet, absichtlich zurücksetzen, sodass es die Ausgabe von ihnen analysieren kann. Die Build-Skripte für viele große Softwarepakete verwenden verschachtelte Aufrufe
make
dieser Koordinate über Umgebungsvariablen. Spezialisierte Tools müssen möglicherweise die Arbeitsbedingungen anderer Programme ändern, die sie starten, indem sie Tricks mit $ LD_PRELOAD oder $ PATH ausführen.Wenn etwas, das ein Benutzer in einem anderen Fenster tut, während eine lange Kompilierung in einem anderen ausgeführt wird, die Umgebungsvariablen aller seiner Prozesse hinter seinem Rücken auf magische Weise ändert , entstehen Wahnsinn und Chaos.
Andere Umgebungsvariablen enthalten Informationen zu der bestimmten Sitzung, in der ein Prozess gestartet wird. Programme erwarten, dass $ TERM den Befehlssatz des bestimmten Terminals (oder Terminalemulators) beschreibt, mit dem sie verbunden sind. Wenn eine allgemeine Einstellung pro Benutzer vorgenommen wird, ist es unmöglich, mit mehreren verschiedenen Arten von Terminals am selben System angemeldet zu sein. Selbst wenn Sie nur über eine Terminalhardware verfügen und sich nie remote anmelden, müssen Programme wie z. B.
screen
einen anderen $ TERM für die Prozesse festlegen, die in ihrer Sitzung ausgeführt werden.Eine bessere Frage wäre, warum wir einen Kommunikationsmechanismus von Prozess zu Unterprozess für Benutzereinstellungen verwenden und nicht eine Datenbank pro Benutzer.
Antwort: Weil es gut genug funktioniert und die Vorteile einer Benutzerdatenbank nicht groß genug sind, um alles zu ändern , um es anstelle von Umgebungsvariablen zu verwenden.
(Ich kann mir nur sehr wenige Voreinstellungen vorstellen, bei denen es keine Anwendungsfälle gibt, in denen es bequem ist, sie nur zum Ausführen eines einzelnen Skripts zu ändern. Um also nicht die Funktionalität zu verlieren, müsste immer noch alles überschrieben werden Umgebungsvariablen, was zu zusätzlicher Komplexität und verwirrteren Benutzern führt).
Es ist nicht so , dass Alternativen nicht vorhanden ist . Beispielsweise befinden sich X-Ressourcen pro Anzeigesitzung und nicht pro Prozess. Aber sie sind nur schwer zugänglich für Kommandozeilen - Programme - und Kommandozeilen - Programme in der Regel arbeiten müssen für Remote - Logins , die nicht einmal hat einen X - Server zu verbinden.
quelle