Warum muss ich in jedem Terminal, das ich öffne, ".profile" quellen?

10

Wenn wir eine Variable in ~/.profileUbuntu ä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 .profileerneut 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.

cainiaofei
quelle
2
Mögliches Duplikat von Wie setze ich Umgebungsvariablen?
Galoget
Wenn Ihre Anmelde- "Shell" eine GUI ist, hilft es nicht viel, die Variable im Anmeldeskript von sh anstelle Ihrer GUI festzulegen.
Ikegami

Antworten:

14

Der Grund dafür ist, dass ~/.profilenur 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 ~/.profilein allen Ihren Terminals wirksam, da sie ~/.profilebeim Anmelden bei Ihrer Sitzung bezogen wird.

Es ist nicht so, dass verschiedene Terminalfenster eine unterschiedliche Umgebung haben, sondern dass die Beschaffung ~/.profilenur ~/.profilein der aktuellen Shell ausgeführt wird (genau das sourcetut der Befehl).

Im Gegensatz dazu wirkt sich eine Änderung von ~/.bashrcsofort auf jedes neue Terminalfenster aus, das Sie öffnen, oder auf jede Bash-Shell, die Sie mit der Eingabe beginnen bash, da sie von allen interaktiven Bash-Shells bezogen wird.

Zanna
quelle
3

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 makedieser 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. screeneinen 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.

hmakholm hat Monica verlassen
quelle