Frage Wie man / etc / environment ohne Neustart neu lädt?


/etc/environment ist offiziell der richtige Platz für systemweite Umgebungsvariablen. Aber wie kann ich? neu laden die Zuweisungen in dieser Datei ohne Neustart oder erneute Anmeldung?

Interessanterweise hilft mir Google hier nicht weiter, abgesehen von den Dutzenden von Blog-Posts, die vorgeschlagen werden, zu verwenden

source /etc/environment

was offensichtlich wird nie arbeiten weil /etc/environment ist eine Liste von Aufgaben (eine pro Zeile) und nicht ein ausführbares Skript (daher das fehlende export Befehle in /etc/environment ...).


132
2017-09-25 11:27


Ursprung


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♦
Funktioniert für mich ohne export... - Izkata
@lzkata: Wenn eine Variable bereits exportiert wurde, sollte es nicht notwendig sein, sie erneut zu exportieren ... Wenn neue Variablen hinzugefügt werden, die noch nicht exportiert wurden, wird die export wäre notwendig ... (ohne es ist es nur eine normale Nicht-Umgebungsvariable in der aktuellen Shell, nicht in untergeordneten Prozessen verfügbar) - Gert van den Berg
@DanielBeck danke..plz füge deinen Kommentar als Antwort hinzu! - Waleed Gadelkareem
funktioniert es auch auf debian und centos? - Massimo


Antworten:


Eine Sache, mit der du dich irrst, ist diese /etc/environment erfordert einen Neustart zum erneuten Laden. Das ist falsch. Die Datei wird nur gelesen bei der Anmeldung, wenn der PAM-Stack aktiviert ist - speziell pam_env.so, der die Datei liest.

Wenn Sie sich an- und abmelden, würden Sie die Änderungen übernehmen - und Sie sogar Muss Tun Sie dies, wenn Sie möchten, dass alle Ihre Prozesse die neue Umgebung erhalten. Alle anderen "Lösungen"2 wird die Umgebung nur auf den einzelnen Shell-Prozess anwenden, aber nicht auf irgendetwas, das Sie über die GUI starten, einschließlich neuer Terminal-Fenster.1

Wenn es dir aber gut geht - dem Mangel an export Befehle können mit kompensiert werden set -a und set +a. Es bleibt jedoch immer noch ein schlechter Weg, da die Datei auch nicht zitiert. Aber das sollte gut funktionieren:

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

1 GNOME Session Manager bietet eine Möglichkeit, seine eigene Umgebung zu ändern, aber nur während der Initialization Phase:

$ 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 Session-Manager (z. gnome-session), Ihr Fenstermanager (z.B. gnome-shell oder openbox), Ihre Taskleiste / Panel falls vorhanden (z.B. xfce4-panel), und generell alles andere, was möglicherweise Dinge laufen lassen würde. Für jeden dieser Prozesse müssen Sie eine Verbindung herstellen gdb dazu durch PID, rufen Sie die putenv() Funktion mit p, dann loslassen 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 pausiert. Daher müssen Sie die Compositing-Fenstermanager nur von einem anderen tty (virtuelle Konsole) oder über SSH anhängen, da sonst der Bildschirm einfriert.

Darüber hinaus, Sie sollten auch 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'}"
()

103
2017-09-25 14:52



Ich habe gerade beim Lesen getestet -r env; exportiere "$ env"; unter Ubuntu 16.04 getan und es Fehler. Möchten Sie mehr Details? - Frank
Das while read Methode liest aus stdin, also möchten Sie wahrscheinlich etwas (z. cat /etc/environment | while ...). Dies funktioniert jedoch nicht mit den mit Zitat formatierten Umgebungsdateien (key="value") - villasv


Dies ist nicht so umfassend wie die angenommene Antwort, aber wenn Sie Variablen in Ihrem zitiert haben /etc/environment Dateien beide früheren Methoden (die verwenden export $line irgendwie) wird schiefgehen und Sie enden mit zitierten Werten.

  • Option 1: mit einer temporären Quelldatei

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


5
2017-08-14 20:12



Kürzere: Eval sed 's/^/export /' /etc/environment - Aaron McMillin
Nicht-temporäre Dateiversion von oben: for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done - Tim Jones
Noch kürzer: set -a; source /etc/environment; set +a;. - ulidtko