Una cosa di cui ti sbagli è che /etc/environment
richiede un riavvio per ricaricare. Questo non è corretto L'unica volta che il file viene letto è al momento dell'accesso , quando lo stack PAM è attivato, in particolare pam_env.so
, che legge il file.
Disconnettersi e riconnettersi applicherebbe le modifiche e, in effetti, è necessario farlo se si desidera che tutti i processi ricevano il nuovo ambiente . Tutte le altre "soluzioni" 2 applicheranno l'ambiente solo al processo della singola shell, ma non a tutto ciò che viene avviato tramite la GUI, comprese le nuove finestre del terminale. 1
Se stai bene con quello, però - la mancanza di export
comandi può essere compensata con set -a
e set +a
. Tuttavia, rimane ancora un modo scadente, in quanto il file non usa neanche il preventivo. Ma questo dovrebbe funzionare bene:
while read -r env; do export "$env"; done
1 GNOME Session Manager fornisce un modo per cambiare il proprio ambiente, ma solo durante la 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
non è una soluzione, ma a volte può essere utilizzato. Devi collegarlo ai processi in esecuzione del gestore della sessione (ad es. gnome-session
), Del gestore della finestra (ad es. gnome-shell
O openbox
), della barra delle attività / del pannello se presente (ad es. xfce4-panel
) E in generale di qualsiasi altra cosa che possa eseguire roba. Per ciascuno di questi processi, è necessario collegarsi gdb
tramite PID, richiamare la putenv()
funzione utilizzando p
, quindi staccare utilizzando 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
Si noti che il debugger mette in pausa il processo, quindi è necessario collegarsi ai gestori di finestre di composizione solo da un'altra tty (console virtuale) o su SSH, altrimenti lo schermo si bloccherebbe.
Inoltre, è necessario aggiornare anche l'ambiente utilizzato da dbus-daemon:
$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux
Per i sistemi più vecchi:
$ gdbus call -e -d org.freedesktop.DBus \
-o /org/freedesktop/DBus \
-m org.freedesktop.DBus.UpdateActivationEnvironment \
"{'FOO': 'bar', 'BAZ': 'qux'}"
()
for line in $( cat /etc/environment ) ; do export $line ; done
, se il formato del file èkey=value
.