2009-09-23 10 views
74

¿Cómo establecer una variable de entorno global en un script bash?Variables de entorno globales en un script de shell

Si hago cosas como

#!/bin/bash 
FOO=bar 

... o

#!/bin/bash 
export FOO=bar 

... los VARs parece permanecer en el contexto local, mientras que me gustaría seguir usándolas después el script ha terminado de ejecutarse.

Respuesta

121

ejecutar su guión con .

. myscript.sh 

Esto ejecutará la secuencia de comandos en el entorno de shell actual.

export gobierna las variables que estarán disponibles para los nuevos procesos, por lo que si usted dice

FOO=1 
export BAR=2 
./runScript.sh 

continuación $BAR estarán disponibles en el entorno de runScript.sh, pero $FOO no lo hará.

+24

Ten cuidado con la primera. Sin una barra, se verá en su camino: use algo como '. ./myscript.sh 'si desea asegurarse de que se ejecute uno específico. – paxdiablo

+1

¡Pensé que global era GLOBAL! Esto borra la última hora de solución de problemas – Dennis

+8

'fuente' es un alias para' .'. Así que podrías ejecutar 'source myscript.sh' en su lugar, si quisieras ser más explícito. –

-3
FOO=bar 
export FOO 
+2

Esto no funciona, no se establece la variable de entorno para el proceso padre. – dreamlax

+3

Solo el proceso principal puede establecer una variable de entorno para el proceso principal. –

45

Cuando ejecuta una secuencia de comandos de shell, se realiza en un subconjunto, por lo que no puede afectar al entorno del shell principal. ¿Quieres a la fuente de la secuencia de comandos haciendo:

. ./setfoo.sh 

Esto lo ejecuta en el contexto de la cáscara actual, no como un sub cáscara .

Desde la página de manual de bash:

. nombre de archivo [argumentos]
nombre de archivo fuente [argumentos]

leer y ejecutar comandos de nombre de archivo en el actual entorno de shell y devuelven el estado de salida del último comando ejecutado de nombre de archivo.

Si el nombre de archivo no contiene una barra inclinada, los nombres de archivo en RUTA se usan para encontrar el directorio que contiene el nombre de archivo.

El archivo buscado en RUTA no necesita ser ejecutable. Cuando bash no es en modo POSIX, el directorio actual se busca si no se encuentra ningún archivo en RUTA.

Si la opción sourcepath al comando builtin shopt está desactivada, no se busca la RUTA.

Si se proporcionan argumentos, se convierten en los parámetros posicionales cuando se ejecuta el nombre del archivo.

De lo contrario, los parámetros posicionales no se modifican.El estado de devolución es el estado del último comando salido dentro del script (0 si no se ejecutan los comandos ) y falso si el nombre del archivo no se encuentra o no se puede leer .

+0

Interesante - No he visto esa sintaxis antes. ¿Esto es equivalente a la fuente ./setfoo.sh? –

+2

Es lo mismo, simplemente más rápido para escribir (y más compatible en sistemas más antiguos: ksh no tiene un comando de origen pero sí tiene '.'). – paxdiablo

4
#!/bin/bash 
export FOO=bar 

o

#!/bin/bash 
FOO=bar 
export FOO 

hombre exportación:

El depósito deberá dar el atributo de exportación a las variables correspondientes a los nombres especificados, que se causan que sean en el entorno de los comandos ejecutados posteriormente. Si el nombre de una variable es seguido por = palabra, entonces el valor de esa variable se establecerá en palabra.

+0

Por favor, para cada principiante en scripting shell: tenga en cuenta que no hay ningún espacio en blanco entre el nombre de envvar, el carácter '=' y el valor mismo; esto no funcionaría: 'export FOO =/mydir/bar' – russellhoff

6

source myscript.sh también es factible.

Descripción de comandos de Linux source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context 
+0

Quizás solo un poco más de detalle aquí. ¿Qué tal una descripción muy breve de lo que hace 'source'? –

+0

@PhillipCloud teclea 'man source' en el terminal y obtendrás lo que deseas. – CDT

+5

Estoy familiarizado con 'fuente'. Tal vez el OP no lo es. –

Cuestiones relacionadas