Una cosa su cui vi sbagliate è che /etc/environment
richiede un riavvio per ricaricare. Questo non è corretto. L'unico momento in cui il file viene letto è on login, quando lo stack PAM è attivato - nello specifico pam_env.so
, che legge il file.
Il logout e il back in applicherebbero le modifiche - e in effetti voi devete farlo se volete che tutti i vostri processi ricevano il nuovo ambiente. Tutte le altre “soluzioni "2 applicheranno l'ambiente solo al singolo processo di shell, ma non a tutto ciò che si lancia attraverso l'interfaccia grafica, compreso il nuovo terminale windows.1
Se questo vi va bene, però - la mancanza di comandi export
può essere compensata con set -a
e set +a
. Tuttavia, rimane comunque un modo povero, dato che il file non usa nemmeno le virgolette. Ma questo dovrebbe funzionare bene:
while read -r env; do export "$env"; done
``` ```
$ 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
1 GNOME Session Manager fornisce un modo per cambiare il proprio ambiente, ma solo durante la fase Initialization
:
$ 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
2 gdb
non è una soluzione, ma può essere usato a volte. Bisogna collegarlo ai processi in esecuzione del proprio gestore di sessione (ad esempio gnome-session
), al gestore di finestre (ad esempio gnome-shell
o openbox
), alla barra delle applicazioni/pannello se presente (ad esempio xfce4-panel
) e, in generale, a qualsiasi altra cosa che possa far funzionare qualcosa. Per ciascuno di questi processi, è necessario allegare gdb
ad esso tramite PID, invocare la funzione putenv()
usando p
, quindi staccare usando q
:
$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux
Si noti che il debugger mette in pausa il processo, quindi è necessario allegare al compositing window manager solo da un'altra tty (console virtuale) o su SSH, altrimenti lo schermo si bloccherebbe.
_ Oltre a ciò,_ si deve anche aggiornare l'ambiente utilizzato da dbus-daemon:
$ gdbus call -e -d org.freedesktop.DBus \
-o /org/freedesktop/DBus \
-m org.freedesktop.DBus.UpdateActivationEnvironment \
"{'FOO': 'bar', 'BAZ': 'qux'}"
()
``` &001
Per i sistemi più vecchi:
&001