Pregunta ¿Cómo volver a cargar / etc / environment sin reiniciar?


/etc/environment es oficialmente el lugar correcto para las variables de entorno de todo el sistema. ¿Pero cómo puedo recargar las asignaciones en este archivo sin reiniciar o relogging?

Curiosamente, Google no me ayuda aquí, aparte de las docenas de publicaciones en blogs que sugieren usar

source /etc/environment

que obviamente lo hará Nunca funciona porque /etc/environment es una lista de asignaciones (una por línea) y no un script ejecutable (de ahí la falta export comandos en /etc/environment ...).


132


origen


En todo el sistema, no tengo idea. Para la sesión de shell actual, puede usar for line in $( cat /etc/environment ) ; do export $line ; done, si el formato de archivo es key=value. - Daniel Beck♦
Funciona para mí sin una export... - Izkata
@lzkata: si ya se exportó una variable, no debería ser necesario exportarla de nuevo ... Si se agregan nuevas variables que aún no se han exportado, la export sería necesario ... (sin él, es solo una variable normal que no es de entorno en el shell actual, no está disponible en procesos secundarios) - Gert van den Berg
@DanielBeck gracias ... ¡por favor agrega tu comentario como respuesta! - Waleed Gadelkareem
¿Funciona también en Debian y Centos? - Massimo


Respuestas:


Una cosa de la que te equivocas 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 la pila PAM está activada, específicamente pam_env.so, que lee el archivo

Cerrar sesión y regresar aplicaría los cambios, y de hecho debe haz esto si quieres que todos tus procesos reciban el nuevo entorno. Todas las demás "soluciones"2 solo aplicará el entorno al único proceso de shell, pero no a todo lo que inicie a través de la GUI, incluidas las nuevas ventanas de terminal.1

Si estás bien con eso, sin embargo, la falta de export comandos pueden ser compensados ​​con set -a y set +a. Sin embargo, sigue siendo una forma pobre, ya que el archivo tampoco utiliza las 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 el 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 se puede usar a veces. Debe adjuntarlo a los procesos en ejecución de su administrador de sesión (p. gnome-session), su administrador de ventanas (p. gnome-shell o openbox), su barra de tareas / panel si corresponde (p. xfce4-panel), y en general cualquier otra cosa que posiblemente podría ejecutar cosas. Para cada uno de esos procesos, debe adjuntar gdb a él por PID, invoque el putenv() utilizar la función p, luego separe 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 pausa el proceso, por lo tanto, debe adjuntarlo a los gerentes de ventana de composición solo desde otra tty (consola virtual) o por 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 antiguos:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()

103



Acabo de probar mientras lee -r env; exportar "$ env"; hecho en Ubuntu 16.04 y errores. ¿Te gustaría más detalles? - Frank
los while read el método lee de stdin, por lo que probablemente desee extraerle algo (p. ej. cat /etc/environment | while ...) Pero esto no funcionará con archivos de entorno con formato de cita (key="value") - villasv


Esto no es tan completo como la respuesta aceptada, pero si tiene variables citadas en su /etc/environment archivos ambos métodos anteriores (que usan export $line de alguna manera) saldrá mal y terminará con valores cotizados.

  • Opción 1: con un archivo temporal con capacidad de fuente

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • Opción 2: con en línea for (gracias @ tim-jones):

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


5



Más corto: eval sed 's/^/export /' /etc/environment - Aaron McMillin
Versión de archivo no temp de arriba: for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done - Tim Jones
Incluso más corto: set -a; source /etc/environment; set +a;. - ulidtko