Variables de entorno global en un script de shell

83

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

Si hago cosas como

#!/bin/bash
FOO=bar

...o

#!/bin/bash
export FOO=bar

... las vars parecen permanecer en el contexto local, mientras que me gustaría seguir usándolas después de que el script haya terminado de ejecutarse.

Alex
fuente

Respuestas:

141

Ejecute su script con .

. myscript.sh

Esto ejecutará el script en el entorno de shell actual.

export gobierna qué variables estarán disponibles para nuevos procesos, así que si dices

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

luego $BARestará disponible en el entorno de runScript.sh, pero $FOOno lo estará.

multitud
fuente
27
Tenga cuidado con el primero. Sin una barra, se verá en su camino: use algo como '. ./myscript.sh 'si desea asegurarse de que ejecute uno específico.
paxdiablo
13
sourcees un alias de .. Así que podrías correr en su source myscript.shlugar, si quisieras ser más explícito.
Ehtesh Choudhury
Me pregunto qué sucede cuando ejecuto un script con un punto y un espacio. ejemplo. myscript
cNgamba
54

Cuando ejecuta un script de shell, se hace en un sub-shell por lo que no puede afectar el entorno del shell principal. Desea obtener el script haciendo:

. ./setfoo.sh

Esto lo ejecuta en el contexto del shell actual , no como un sub shell.

Desde la página de manual de bash:

. nombre de archivo [argumentos]
nombre de archivo de origen [argumentos]

Leer y ejecutar comandos desde el nombre de archivo en el entorno de shell actual y devolver el estado de salida del último comando ejecutado desde el nombre de archivo.

Si el nombre de archivo no contiene una barra, los nombres de archivo en PATH se utilizan para encontrar el directorio que contiene el nombre de archivo.

No es necesario que el archivo buscado en PATH sea ejecutable. Cuando bash no está en modo POSIX, se busca en el directorio actual si no se encuentra ningún archivo en PATH.

Si la opción sourcepath del comando integrado shopt está desactivada, no se busca en PATH.

Si se proporcionan argumentos, se convierten en parámetros posicionales cuando se ejecuta filename.

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

paxdiablo
fuente
Interesante, no había visto esa sintaxis antes. ¿Es esto equivalente a source ./setfoo.sh?
ire_and_curses
2
Es lo mismo, solo que más rápido de escribir (y más compatible en sistemas más antiguos: ksh no tiene comando de código fuente pero sí tiene '.').
paxdiablo
9

source myscript.sh también es factible.

Descripción para el comando linux source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context
CDT
fuente
Quizás solo un poco más de detalle aquí. ¿Qué tal una descripción muy breve de lo que sourcehace?
Phillip Cloud
@PhillipCloud escribe man sourceen la terminal y obtendrás lo que quieres.
CDT
5
Estoy familiarizado con source. Quizás el OP no lo sea.
Phillip Cloud
2
@PhillipCloud Me gustaría más detalles, yo mismo. Si desea editar la respuesta, definitivamente puede hacerlo. Ayuda a la causa y todo eso ... ¡Gracias!
Dan Rosenstark
4
#!/bin/bash
export FOO=bar

o

#!/bin/bash
FOO=bar
export FOO

exportar hombre:

El shell dará el atributo de exportación a las variables correspondientes a los nombres especificados, lo que hará que estén en el entorno de los comandos ejecutados posteriormente. Si el nombre de una variable va seguido de = palabra, el valor de esa variable se establecerá en palabra.

Andrejs Cainikovs
fuente
Por favor, para todos los principiantes en scripts de shell: tenga en cuenta que no hay ningún espacio en blanco entre el nombre de envvar, el carácter '=' y el valor en sí; esto no funcionaría:export FOO = /mydir/bar
Russellhoff
-3
FOO=bar
export FOO
Niko
fuente
2
Esto no funciona, no establece la variable de entorno para el proceso principal.
dreamlax
3
Solo el proceso principal puede establecer una variable de entorno para el proceso principal.
Glenn Jackman