Una cosa en la que te equivocas es que /etc/environment
requiere un reinicio para recargar. Esto es incorrecto. La única vez que se lee el archivo es en el inicio de sesión, cuando se activa la pila PAM - específicamente pam_env.so
, que lee el archivo.
Salir y volver a entrar aplicaría los cambios - y de hecho usted _debe hacer esto si quiere que todos sus procesos reciban el nuevo entorno. Todas las demás “soluciones "2 sólo aplicarán el entorno al proceso de shell único, pero no a nada que se lance a través de la GUI incluyendo las nuevas terminales windows.1
Si te parece bien, sin embargo - la falta de comandos export
puede ser compensada con set -a
y set +a
. Sin embargo, sigue siendo una forma pobre, ya que el archivo tampoco utiliza las citas. Pero esto debería funcionar bien:
while read -r env; do export "$env"; done
1 El Gestor de sesiones de GNOME proporciona una forma de cambiar su propio entorno, pero sólo durante la fase Initialization
:
$ 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
no es una solución, pero se puede usar a veces. Debe adjuntarlo a los procesos en ejecución de su gestor de sesiones (por ejemplo, gnome-session
), su gestor de ventanas (por ejemplo, gnome-shell
o openbox
), su barra de tareas/panel si lo hay (por ejemplo, xfce4-panel
), y en general cualquier otra cosa que pueda ejecutar cosas. Para cada uno de esos procesos, necesitas adjuntarle gdb
por PID, invocar la función putenv()
usando p
, y luego separar usando 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
Nota que el depurador pausa el proceso, por lo tanto debes adjuntar a los gestores de ventanas de composición sólo desde otra tty (consola virtual) o sobre SSH, de lo contrario la pantalla se congelaría.
Además de eso, también deberías actualizar el entorno usado por dbus-daemon:
$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux
Para sistemas antiguos:
$ gdbus call -e -d org.freedesktop.DBus \
-o /org/freedesktop/DBus \
-m org.freedesktop.DBus.UpdateActivationEnvironment \
"{'FOO': 'bar', 'BAZ': 'qux'}"
()