it-swarm-es.com

Forma definitiva e inmediata de exportar una ruta

Supongamos que quiero exportar una ruta, digamos FOOBAR y hacer que los cambios no solo sean efectivos de inmediato y en todas partes, sino también permanentes. Mi objetivo es tener una lista de comandos que pueden ingresarse manualmente en una sesión activa de Shell, así como ejecutarse desde un script de Shell (que a su vez podría ejecutarse a través del Shell o un administrador de archivos GUI, etc.).

Los procesos antiguos no necesitan estar al tanto de ningún cambio.

Esto es lo que quiero que le pase a FOOBAR:

  • Agregue un nuevo valor sin sobrescribir los valores anteriores.
  • Haga que el cambio sea accesible en todo el sistema (para cualquier programa o sesión de Shell, sin importar cómo se inicie) dentro del contexto del usuario actual.
  • Haga que el cambio sea efectivo de inmediato (es decir, no se requiere cerrar sesión, etc.)

Mi enfoque actual es exportar el valor como un comando set a _.profile_ y _.bashrc_:

_echo "export FOOBAR=$FOOBAR:$HOME/example/" >> $HOME/.profile;
echo "export FOOBAR=$FOOBAR:$HOME/example/" >> $HOME/.bashrc;
source $HOME/.profile;
_

¿Cómo se puede mejorar esto en términos de:

  • Funciona, pero ¿hay casos en los que esto fallará y cómo puedo evitarlos (es decir, si hay algún proceso o acción común que un usuario de ubuntu realizará, etc., que rompa mi ruta exportada)?
  • ¿Existen problemas de seguridad con este enfoque y cómo se pueden solucionar?
  • ¿Hay otras colisiones o consecuencias negativas a las que deba prestar atención para que esto sea lo más universal posible (dentro de la familia ubuntu)?
3
mınxomaτ
  • debe ser ~/.profile o .bashrc. No ambas, ya que /.bashrc está cargado -desde- ~/.profile.
  • Un Shell sin inicio de sesión solo cargará ~/.bashrc y no /etc/profile, ~/.bash_profile, ~/.bash_login o ~/.profile así que si eso es una preocupación ~/.profile es no va a ser usado.
  • un no inicio de sesión sin Shell cargará la configuración establecida en $BASH_ENV. No he encontrado lo que son cargas pero ~/.bashrc debería ser una de ellas.

Con respecto a su primer punto de viñeta:

  • Probablemente no sea una buena idea. Y probablemente no como funciona. Cuando vuelve a cargar las variables de entorno, comenzarán desde vacío (suponiendo que quiere decir que no debe vaciarse al volver a cargarlas ;-)).

Con respecto a su segundo punto de viñeta:

  • si lo desea para todos los usuarios, use /etc/profile o /etc/environment. / etc/environment es el lugar correcto para las variables de entorno de todo el sistema. Y también: esto descarta ~/.profile.

Con respecto a su 3er punto:

/etc/environment no requiere reiniciar. Requiere un reinicio de sesión. Y debe hacerse con un reinicio de sesión; puede obtenerlo de nuevo, pero eso solo se aplica a su sesión y a lo que se inicia después de obtenerlo. No para procesos que ya se están ejecutando.

Sin embargo

. /etc/environment

es un método para recargar todas las variables. Pero de nuevo: esto no los restablece para los procesos que se ejecutan actualmente. Solo para el Shell actual y los procesos recién iniciados.

Con respecto a la cuarta, quinta y sexta viñeta:

El único problema que puedo ver es que podría volverse loco. Si lo agrega a ~/.bashrc y obtiene ese valor 10, 20 veces, su variable se inundará con las mismas partes.

Y no y no. Sin riesgos de seguridad.

4
Rinzwind