¿Puedo exportar una variable al entorno desde un script Bash sin obtenerla?

Resuelto Salah Eddine Taouririt asked hace 11 años • 13 respuestas

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 $VARsimplemente ejecutándolo export.bashsin obtenerlo?

Salah Eddine Taouririt avatar May 18 '13 04:05 Salah Eddine Taouririt
Aceptado

¿Hay alguna forma de acceder al $VARsimplemente ejecutándolo export.bashsin obtenerlo?

Respuesta rápida: No.

Pero hay varias soluciones posibles.

La más obvia, que ya mencionaste, es usar sourceo .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).

Keith Thompson avatar May 17 '2013 23:05 Keith Thompson

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
V H avatar May 17 '2013 21:05 V H