TL; DR
Diese Konfigurationsdateien, egal ob global ( /etc/environment
, /etc/profile
) oder benutzerspezifisch ( ~/.profile
, ~/.bashrc
), werden erst bei der nächsten Anmeldung / Sitzung verarbeitet.
Die globalen Dateien gelten für alle Benutzer (nicht nur für root). Sie müssen jedoch Ihre Anmeldesitzung neu starten, um die Änderungen in der Umgebung zu sehen. Dies kann geschehen, indem Sie anrufen, su
wie Sie es beobachtet haben ... oder indem Sie sich abmelden / anmelden oder einen Neustart durchführen. Sie könnten su
zu einem Nicht-Root-Benutzer und Sie würden sehen, dass sie auch die Umgebungsänderungen haben.
Der Grund, warum Sie neu starten oder sich erneut anmelden müssen, damit die globale Umgebung erkannt wird, ist, dass die Umgebung von übergeordneten Prozessen geerbt wird und der Stammprozess für alles andere, was Sie ausführen, Ihre Anmeldeshell ist die Umgebung ... dann auch nicht die Prozesse innerhalb der Login-Shell gestartet. Natürlich können Sie die Umgebung für einzelne Prozesse beim Starten festlegen / aktualisieren, aber Sie müssen die Umgebung für die Anmeldeshell festlegen und alle Unterprozesse neu starten, damit sie die Änderung sehen.
Globale Umwelt
Wie jemand anderes erwähnt, benötigen Sie einen Neustart oder Abmelden / login für die Änderungen /etc/profile
, /etc/profile.d/*.sh
und /etc/environment
abgeholt werden.
Dies liegt daran, dass diese Dateien zwar eine globale Umgebung angeben, jedoch nur einmal bei der Anmeldung ausgeführt werden und vorhandene Anmeldungen / Sitzungen Änderungen an diesen Dateien nicht widerspiegeln. Ein Neustart "setzt" die Anmeldung aller zurück und zwingt sie, die neue Umgebung zu übernehmen.
In Ihrer eigenen Anmeldesitzung können Sie source /etc/profile
die Änderungen ohne Neustart oder Abmelden / Anmelden übernehmen. Dies wirkt sich jedoch nur auf Ihre eigene Sitzung und auf neue Prozesse aus, die in Ihrer Sitzung ausgeführt werden.
Beachten Sie auch, dass es keine Variableninterpolation gibt /etc/environment
(es ist kein Skript), so dass Sie so etwas nicht machen PATH="$PATH:/my/custom/path"
können.
Beachten Sie auch, dass /etc/profile
und /etc/profile.d/*.sh
nur für Anmeldesitzungen ausgeführt werden und daher die dort konfigurierte Umgebung für nicht angemeldete Systemkonten nicht verfügbar ist (dh, wenn Sie versuchen, eine Umgebungsvariable für einen Dämonprozess festzulegen, der außerhalb Ihrer Anmeldeshell ausgeführt wird).
Beachten Sie, dass dies bashrc
nicht zum Festlegen der Umgebung für die gesamte Anmeldeshell nützlich ist, sondern für Bash-Shells und Unterprozesse. Für echte "globale" oder "globale Benutzer" möchten Sie wahrscheinlich Ihre Umgebungskonfiguration in /etc/profile
oder /etc/profile.d/my-custom-env.sh
oder einfügen ~/.profile
. Andere Shells (z. B. zsh) haben ebenfalls ihre eigenen Konfigurationsdateien, sodass nicht bash-spezifische Umgebungskonfigurationen in einem bashrc Probleme oder Verwirrung verursachen, wenn Sie die Shells wechseln (oder andere Benutzer im System andere Shells verwenden).
Es ist ein häufiges Problem, ein neues Programm zu installieren und eine Umgebung anzugeben, damit es ordnungsgemäß ausgeführt wird. Globale Umgebung ist eine Antwort, erfordert jedoch häufig einen Neustart, der für Server und die automatische Bereitstellung / Konfiguration von Anwendungsfällen nicht ideal ist. Sie sollten sich fragen, ob dies wirklich eine Variable ist, die alle Benutzer und Programme auf dem System benötigen, oder ob dies wirklich nur etwas ist, das Sie einem bestimmten Benutzer oder Programm zur Verfügung stellen müssen.
Für einen bestimmten Benutzer
Sehen Sie sich an, wie Sie die Umgebung in profile oder bashrc in das Home-Verzeichnis des Benutzers aufnehmen (z. B. ~/.profile
~/.bashrc
), je nachdem, ob Sie dies für interaktive Shells, Login-Shells, Nur-Bash-Shells usw. wünschen.
Beachten Sie, dass dies auch einen Neustart oder eine Abmeldung / Anmeldung erfordert, damit die Umgebungsänderungen für alle Prozesse in der Anmeldesitzung des Benutzers verfügbar sind. Der Benutzer kann source ~/.profile
... aber dies geschieht innerhalb eines Terminals und aktualisiert nur die Umgebung innerhalb dieser Terminalsitzung und der untergeordneten Prozesse ... nicht unbedingt für die gesamte Anmeldeumgebung des Benutzers.
Für ein bestimmtes Programm gibt es einige Optionen.
Eine besteht darin, nur die Umgebung bereitzustellen, wenn der Befehl ausgeführt wird:
VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2
Wenn Sie systemd verwenden, können Sie die Umgebung auch in der Geräte- / Servicedatei unter [Service]
mit angebenEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE
Diese Option fühlt sich möglicherweise schwierig an, da Sie die Umgebung jedes Mal angeben müssen, wenn Sie ein Programm ausführen, aber wenn die Umgebung wirklich nur von diesem Programm benötigt wird, ist dies der beste Weg, und Sie sollten sich daran gewöhnen und nicht alles sichern in eine bashrc oder profile Datei.
Wenn Sie zum Einrichten der Umgebung und zum Ausführen des Programms nicht systemd oder init verwenden, können Sie die Programmausführung natürlich auch einfach mit einem Bash-Skript abschließen, in dem Sie den vollständigen Befehl einschließlich des Einrichtens der Umgebung speichern.
Verweise:
Hier gibt es auch eine sehr ausführliche Antwort, die Sie lesen sollten: /ubuntu//a/247769/824160