Wie kann man / etc / environment ohne Neustart neu laden?

157

/etc/environmentist offiziell der richtige Ort für systemweite Umgebungsvariablen. Aber wie kann ich die Zuordnungen in dieser Datei neu laden, ohne neu zu starten oder neu zu protokollieren?

Interessanterweise hilft mir Google hier nicht weiter, abgesehen von den Dutzenden von Blog-Posts, die die Verwendung vorschlagen

source /etc/environment

Das wird natürlich nie funktionieren, da /etc/environmentes sich um eine Liste von Zuweisungen (eine pro Zeile) und kein ausführbares Skript handelt (daher die fehlenden exportBefehle in /etc/environment...).

fgysin
quelle
11
Systemweit habe ich keine Ahnung. Für die aktuelle Shell-Sitzung können Sie verwenden for line in $( cat /etc/environment ) ; do export $line ; done, wenn das Dateiformat ist key=value.
Daniel Beck
2
Funktioniert für mich ohne export...
Izkata
2
@lzkata: Wenn eine Variable bereits exportiert wird, sollte es nicht notwendig sein, sie erneut zu exportieren ... Wenn neue Variablen hinzugefügt werden, die noch nicht exportiert wurden, exportwäre das notwendig ... (ohne es handelt es sich nur um ein normales Non -Umgebungsvariable in der aktuellen Shell, in untergeordneten Prozessen nicht verfügbar)
Gert van den Berg
@DanielBeck danke..plz füge deinen Kommentar als Antwort hinzu!
Gadelkareem
funktioniert es auch bei debian und centos?
Massimo

Antworten:

122

Eine Sache, bei der Sie sich irren, ist, /etc/environmentdass zum Neuladen ein Neustart erforderlich ist. Das ist falsch. Das einzige Mal, dass die Datei gelesen wird, ist die Anmeldung , wenn der PAM-Stapel aktiviert ist - speziell pam_env.so, der die Datei liest.

Das Abmelden und erneutes Anmelden würde die Änderungen übernehmen - und tatsächlich müssen Sie dies tun, wenn alle Prozesse die neue Umgebung erhalten sollen . Bei allen anderen "Lösungen" 2 wird die Umgebung nur auf den Single-Shell-Prozess angewendet, nicht jedoch auf alles, was Sie über die GUI starten, einschließlich neuer Terminalfenster. 1

Wenn Sie damit einverstanden sind, können Sie das Fehlen von exportBefehlen mit set -aund ausgleichen set +a. Es bleibt jedoch immer noch ein schlechter Weg, da die Datei auch keine Anführungszeichen verwendet. Aber das sollte gut funktionieren:

while read -r env; do export "$env"; done

1 GNOME Session Manager bietet eine Möglichkeit, die eigene Umgebung zu ändern, jedoch nur während der InitializationPhase:

$ gdbus call -e -d org.gnome.SessionManager \
                -o /org/gnome/SessionManager \
                -m org.gnome.SessionManager.Setenv \
                "FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
    interface is only available during the Initialization phase

2 gdb ist keine Lösung, kann aber manchmal verwendet werden. Sie müssen es an die laufenden Prozesse Ihres Sitzungsmanagers (z. B. gnome-session), Ihres Fenstermanagers (z. B. gnome-shelloder openbox), Ihrer Taskleiste / Ihres Panels (z. B. xfce4-panel) und generell an alles andere anhängen, das möglicherweise Dinge ausführen würde. Für jeden dieser Prozesse müssen Sie eine Verbindung gdbmit der PID herstellen, die putenv()Funktion mit aufrufen pund dann die Verbindung trennen mit q:

$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6

(gdb) p putenv("FOO=bar")
$1 = 0

(gdb) p putenv("BAZ=qux")
$2 = 0

(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718

Beachten Sie, dass der Debugger den Prozess anhält. Daher müssen Sie Compositing-Fenstermanagern nur von einer anderen Tty (virtuellen Konsole) oder über SSH aus eine Verbindung herstellen, da der Bildschirm sonst einfrieren würde.

Außerdem sollten Sie die von dbus-daemon verwendete Umgebung aktualisieren:

$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux

Für ältere Systeme:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()
Grawity
quelle
1
Ich habe gerade getestet, während ich -r env gelesen habe. exportiere "$ env"; gemacht auf Ubuntu 16.04 und es Fehler. Wünschen Sie weitere Details?
Frank
Die while readMethode liest aus stdin, daher möchten Sie wahrscheinlich etwas an sie weiterleiten (z cat /etc/environment | while .... B. ). Dies funktioniert jedoch nicht mit in Anführungszeichen formatierten Umgebungsdateien ( key="value")
villasv
6

Dies ist nicht so umfassend wie die akzeptierte Antwort, aber wenn Sie Variablen in Ihren /etc/environmentDateien in Anführungszeichen gesetzt haben, werden beide vorherigen Methoden (die export $lineirgendwie verwendet werden) schief gehen und Sie erhalten Werte in Anführungszeichen.

  • Option 1: mit einer temporären quellfähigen Datei

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • Option 2: mit inline for(danke @ tim-jones):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done

villasv
quelle
4
Kürzere: evalsed 's/^/export /' /etc/environment
Aaron McMillin
2
Non-Temp-File-Version von oben:for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
Tim Jones
7
Noch kürzere: set -a; source /etc/environment; set +a;.
ulidtko