Una cosa con la que se equivoca es que /etc/environment
requiere un reinicio para volver a cargar. Esto es incorrecto. La única vez que se lee el archivo es al iniciar sesión , cuando se activa la pila PAM, específicamente pam_env.so
, que lee el archivo.
Cerrar sesión y volver a iniciarla aplicaría los cambios, y de hecho debe hacerlo si desea que todos sus procesos reciban el nuevo entorno . Todas las demás "soluciones" 2 solo aplicarán el entorno al proceso de shell único, pero no a todo lo que inicie a través de la GUI, incluidas las nuevas ventanas de terminal. 1
Sin embargo, si está de acuerdo con eso, la falta de export
comandos se puede compensar con set -a
y set +a
. Sin embargo, sigue siendo un mal camino, ya que el archivo tampoco usa comillas. Pero esto debería funcionar bien:
while read -r env; do export "$env"; done
1 GNOME Session Manager proporciona una forma de cambiar su propio entorno, pero 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
no es una solución, pero puede usarse a veces. Debe adjuntarlo a los procesos en ejecución de su administrador de sesión (p gnome-session
. Ej. ), Su administrador de ventanas (p. Ej. gnome-shell
O openbox
), su barra de tareas / panel si corresponde (p xfce4-panel
. Ej. ) Y, en general, cualquier otra cosa que pueda ejecutar cosas. Para cada uno de esos procesos, debe adjuntarlo gdb
mediante PID, invocar la putenv()
función usando p
, luego desconectar 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
Tenga en cuenta que el depurador detiene el proceso, por lo tanto, debe adjuntar a los administradores de ventanas de composición solo desde otro tty (consola virtual) o sobre SSH; de lo contrario, la pantalla se congelaría.
Además de eso, también debe actualizar el entorno utilizado por dbus-daemon:
$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux
Para sistemas más antiguos:
$ 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
, si el formato de archivo eskey=value
.