2011-09-25 11:27:43 +0000 2011-09-25 11:27:43 +0000
163
163

Jak przeładować /etc/environment bez restartu?

/etc/environment jest oficjalnie właściwym miejscem dla systemowych zmiennych środowiskowych. Ale jak mogę przeładować przypisania w tym pliku bez restartu i ponownego logowania?

Ciekawe, że google mi tu nie pomaga, poza dziesiątkami postów na blogu sugerujących użycie

source /etc/environment

, które oczywiście nigdy nie zadziałają** ponieważ /etc/environment jest listą przysyłanych (jedna na linię) i nie skryptem wykonywalnym (stąd brakujące komendy export w /etc/environment …).

Odpowiedzi (2)

126
126
126
2011-09-25 14:52:06 +0000

Een ding dat u zich vergist is dat /etc/environment een reboot nodig heeft om te herladen. Dit is onjuist. De enige keer dat het bestand wordt gelezen is op login, wanneer de PAM stack is geactiveerd - specifiek pam_env.so, die het bestand leest.

Uitloggen en terug naar binnen zou de veranderingen toepassen - en in feite moet je _ dit doen als je wilt dat al je processen de nieuwe omgeving ontvangen. Alle andere “oplossingen "2 zullen de omgeving alleen toepassen op het single shell proces, maar niet op alles wat je lanceert via de GUI inclusief nieuwe terminalvensters.1

Als je dat echter goed vindt - het gebrek aan export commando’s kan worden gecompenseerd met set -a en set +a. Het blijft echter een slechte manier, omdat het bestand ook geen gebruik maakt van citeren. Maar dit zou prima moeten werken:

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

1 GNOME Session Manager biedt een manier om de eigen omgeving te veranderen, maar alleen tijdens de Initialization-fase:

$ 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 is geen oplossing, maar kan soms wel gebruikt worden. U moet het koppelen aan de lopende processen van uw sessiemanager (bijv. gnome-session), uw windowmanager (bijv. gnome-shell of openbox), uw taakbalk/paneel als die er is (bijv. xfce4-panel), en in het algemeen alles wat mogelijk is om dingen te laten draaien. Voor elk van deze processen dient u gdb aan te sluiten via PID, de putenv()-functie aan te roepen met p en vervolgens los te koppelen met 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

Noteer dat de debugger het proces pauzeert, daarom dient u alleen aan te sluiten bij het samenstellen van window managers vanaf een andere tty (virtuele console) of over SSH, anders zou het scherm bevriezen.

,_ Daarnaast,_ dient u ook de door dbus-daemon gebruikte omgeving te updaten:

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

Voor oudere systemen:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()
6
6
6
2017-08-14 20:12:59 +0000

Nie jest to tak wyczerpujące jak przyjęta odpowiedź, ale jeśli masz cytowane zmienne w swoich plikach /etc/environment, obie poprzednie metody (które jakoś używają export $line) pójdą źle i skończysz z cytowanymi wartościami.

  • Opcja 1: z tymczasowym plikiem źródłowym

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh - Opcja 2: z inline for (dzięki @tim-jones):

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