71 votos

Exportar una variable para el medio ambiente a partir de un script de bash sin surtiendo

supongamos que tengo este script

a la exportación.bash :

#! /usr/bin/env bash
export VAR="HELLO, VARABLE"

cuando ejecuto el script, y tratar de acceso a la $VAR no tengo valor !

echo $VAR

¿Hay alguna manera de acceder a la $VAR simplemente ejecutando la exportación.bash sin abastecimiento ?

90voto

Keith Thompson Puntos 85120

¿Hay alguna manera de acceder a la $VAR simplemente ejecutando export.bash sin abastecimiento ?

Respuesta rápida: No.

Pero hay varias soluciones posibles.

La más obvia, la que ya he mencionado, es el uso de source o . a ejecutar la secuencia de comandos en el contexto de la llamada shell:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

Otra manera es tener la secuencia de comandos, en lugar de establecer una variable de entorno, los comandos de impresión en la que se establece la variable de entorno:

$ cat set-vars2.sh
#!/bin/bash

echo export FOO=BAR
$ eval $(./set-vars2.sh)
$ echo $FOO
BAR

Tenga en cuenta que el $(...) se unirá a la salida en una sola línea. Si usted tiene más de una cosa a establecer, usted debe agregar un punto y coma el impreso de comandos por lo que están siendo válida después de que se unieron.

Un tercer enfoque es tener un script que establece con su entorno variable(s) internamente y, a continuación, se invoca un comando especificado con ese ambiente:

$ cat set-vars3.sh
#!/bin/bash

export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

Este último enfoque puede ser muy útil, a pesar de que es un inconveniente para el uso interactivo ya que no te da las opciones de configuración del shell actual (con todos los otros valores y de la historia que hemos construido).

14voto

vahid Puntos 2070

Con el fin de exportar la variable VAR primera la más lógica y parece modo de trabajo es la fuente de la variable:

. ./export.bash

o

source ./export.bash

Ahora, cuando haciéndose eco de las principales shell funciona

 echo $VAR
HELLO, VARABLE

Ahora vamos a restablecer VAR

export VAR=""
echo $VAR

Ahora vamos a ejecutar una secuencia de comandos a la fuente de la variable, a continuación, deshacer :

./test-export.sh 
HELLO, VARABLE
--
.

el código: cat 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í está una manera

Por FAVOR NOTA: Las exportaciones se limitan a la secuencia de comandos que se ejecutan las exportaciones en su consola principal - así que eso de un cron job que me gustaría añadir es como el de la consola, como el de abajo... para el comando parte todavía cuestionable: aquí es cómo se puede ejecutar desde la consola:

En el símbolo del sistema (tan largo como el de exportación.bash tiene múltiples eco de valores)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE

gato v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

Ahora siempre que sea para su uso, podría hacer que las variables disponibles para las secuencias de comandos en cualquier momento haciendo un alias de bash como este:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

agregue esto a su .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

}

el origen del archivo bashrc y se puede hacer como antes, a cualquier hora ...

De todos modos al resto de ella..

Esto ha hecho disponible a nivel mundial, a continuación, ejecuta la secuencia de comandos..

simplemente echo un vistazo, a continuación, ejecute la exportación en el eco !

gato de exportación.bash

#!/bin/bash
echo "VAR=HELLO THERE"

Ahora dentro de secuencia de comandos o la consola ejecuta:

 export "$(./export.bash)"

Probar:

echo $VAR
HELLO THERE

Varios valores tan largo como usted sabe lo que usted está esperando en otra secuencia de comandos utilizando el método anterior:

gato de exportación.bash

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

gato test-export.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 la asignación automática de leer 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: gato test-export.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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X