example - bash script
* exportar*todas las variables de clave=archivo de valor a shell (2)
Si quiero heredar variables de entorno a procesos secundarios, hago algo como:
export MYVAR=tork
Supongamos que tengo un archivo site.conf
contiene asignaciones de valores (que pueden contener espacios) a las variables:
EMAIL="[email protected]"
FULLNAME="Master Yedi"
FOO=bar
Ahora me gustaría procesar este archivo cada vez que abro un nuevo shell (por ejemplo, con algo de código en ~/.bashrc
o ~/.profile
), de modo que cualquier proceso iniciado desde ese nuevo shell abierto heredará las asignaciones a través de variables ambientales.
La solución obvia sería prefijar cada línea en site.conf
con una export
y simplemente site.conf
el archivo. Sin embargo, no puedo hacer esto ya que el archivo también es leído (directamente) por otras aplicaciones, por lo que el formato es fijo.
Probé algo como
cat site.conf | while read assignment
do
export "${assignment}"
done
Pero esto no funciona, por varias razones (la más importante es que la export
se ejecuta en una subshell, por lo que la variable nunca se exportará a los elementos secundarios del shell de llamada).
¿Hay una manera de export
programación export
variables desconocidas en bash?
Ejecute set -a
antes de obtener el archivo. Esto marca todas las variables nuevas y modificadas que siguen para exportar automáticamente.
set -a
source site.conf
set +a # Require export again, if desired.
El problema que observaste es que la tubería ejecuta la export
en una subshell. Puede evitar eso simplemente utilizando la redirección de entrada en lugar de una tubería.
while read assignment; do
export "$assignment"
done < site.conf
Sin embargo, esto no funcionará si (aunque es poco probable) tiene varias asignaciones en una línea, como
EMAIL="[email protected]" FULLNAME="Master Yedi"
El problema es cat site.conf | while read assignment
cat site.conf | while read assignment
utilizando tuberías.
Las canalizaciones crean un sub-shell, por lo tanto, la variable creada mediante la export
se crea en un sub-shell y no está disponible en su shell actual.
Usted puede simplemente hacer:
source $HOME/site.conf
desde su ~/.bashrc
para exportar todas las variables y hacer que estén disponibles en shell.