¿Puedo exportar una variable al entorno desde un script Bash sin obtenerla?
Supongamos que tengo este script:
exportar.bash :
#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"
Cuando ejecuto el script e intento acceder al archivo $VAR
, ¡no obtengo ningún valor!
echo $VAR
¿Hay alguna manera de acceder $VAR
simplemente ejecutándolo export.bash
sin obtenerlo?
¿Hay alguna forma de acceder al
$VAR
simplemente ejecutándoloexport.bash
sin obtenerlo?
Respuesta rápida: No.
Pero hay varias soluciones posibles.
La más obvia, que ya mencionaste, es usar source
o .
ejecutar el script en el contexto del shell que llama:
$ cat set-vars1.sh
export FOO=BAR
$ . set-vars1.sh
$ echo $FOO
BAR
Otra forma es hacer que el script, en lugar de configurar una variable de entorno, imprima comandos que configurarán la variable de entorno:
$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR
Un tercer enfoque es tener un script que establezca las variables de entorno internamente y luego invoque un comando específico con ese entorno:
$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR
Este último enfoque puede ser bastante útil, aunque es inconveniente para el uso interactivo ya que no le brinda la configuración en su shell actual (con todas las demás configuraciones e historial que ha creado).
Para exportar primero la variable VAR, la forma más lógica y adecuada es obtener la variable:
. ./export.bash
o
source ./export.bash
Ahora, cuando se hace eco desde el shell principal, funciona:
echo $VAR
HELLO, VARIABLE
Ahora restableceremos el VAR:
export VAR=""
echo $VAR
Ahora ejecutaremos un script para obtener la variable y luego la desarmaremos:
./test-export.sh
HELLO, VARIABLE
--
.
El código: archivo test-export.sh
#!/bin/bash
# Source env variable
source ./export.bash
# echo out the variable in test script
echo $VAR
# unset the variable
unset VAR
# echo a few dotted lines
echo "---"
# now return VAR which is blank
echo $VAR
Aquí hay una manera:
Tenga en cuenta : las exportaciones se limitan al script que ejecuta las exportaciones en su consola principal; en lo que respecta a un trabajo cron , lo agregaría como la consola, como se muestra a continuación... para la parte del comando aún es cuestionable: así es como lo haría ejecuta desde tu shell:
En su símbolo del sistema (siempre que el archivo export.bash tenga múltiples valores de eco)
IFS=$'\n'; for entries in $(./export.bash); do export $entries; done; ./v1.sh
HELLO THERE
HI THERE
Archivo gato v1.sh
#!/bin/bash
echo $VAR
echo $VAR1
Ahora, siempre que esto sea para su uso, puede hacer que las variables estén disponibles para sus scripts en cualquier momento creando un alias de Bash como este:
myvars ./v1.sh
HELLO THERE
HI THERE
echo $VAR
.
Agregue esto a su archivo .bashrc :
function myvars() {
IFS=$'\n';
for entries in $(./export.bash); do export $entries; done;
"$@";
for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done
}
Obtenga su archivo .bashrc y podrá hacer lo anterior en cualquier momento...
De todos modos, volvamos al resto...
Esto lo hizo disponible globalmente y luego ejecutó el script...
¡Simplemente repítelo y ejecuta la exportación en el eco!
Archivo exportar.bash
#!/bin/bash
echo "VAR=HELLO THERE"
Ahora dentro del script o en tu consola ejecuta:
export "$(./export.bash)"
Intentar:
echo $VAR
HELLO THERE
Múltiples valores siempre que sepa lo que espera en otro script utilizando el método anterior:
Archivo exportar.bash
#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"
Archivo prueba-exportación.sh
#!/bin/bash
IFS=$'\n'
for entries in $(./export.bash); do
export $entries
done
echo "round 1"
echo $VAR
echo $VAR1
for entries in $(./export.bash); do
variable=$(echo $entries|awk -F"=" '{print $1}');
unset $variable
done
echo "round 2"
echo $VAR
echo $VAR1
Ahora los resultados
./test-export.sh
round 1
HELLO THERE
HI THERE
round 2
.
Y la última actualización final para asignar automáticamente, lea las VARIABLES:
./test-export.sh
Round 0 - Export out then find variable name -
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them
round 3 - Now we get nothing back
La secuencia de comandos:
Archivo prueba-exportación.sh
#!/bin/bash
IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
variable=$(echo $entries|awk -F"=" '{print $1}');
export $entries
eval current_variable=\$$variable
echo "\$$variable has value of $current_variable"
done
echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1
echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
variable=$(echo $entries|awk -F"=" '{print $1}');
unset $variable
done
echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1