2011-12-22 19 views
28

Quiero usar un script de shell que pueda llamar para establecer algunas variables de entorno. Sin embargo, después de la ejecución del script, no veo la variable de entorno usando "printenv" en bash.Establecer la variable de entorno en el script de shell no lo hace visible para el shell

Aquí es mi guión:

#!/bin/bash 

echo "Hello!" 
export MYVAR=boubou 
echo "After setting MYVAR!" 

Cuando hago "./test.sh", veo:

Hello! 
After setting MYVAR! 

Cuando hago "MYVAR printenv", no veo nada.

¿Me puede decir lo que estoy haciendo mal?

Respuesta

49

Así es como funcionan las variables de entorno. Cada proceso tiene una copia del entorno. Cualquier cambio que el proceso haga en su copia se propague a los hijos del proceso. Sin embargo, no se propagan al padre del proceso.

Una forma de evitar esto es mediante el comando source:

source ./test.sh 

o

. ./test.sh 

(las dos formas son sinónimos).

Al hacer esto, en lugar de ejecutar la secuencia de comandos en un subconjunto, bash ejecutará cada comando en la secuencia de comandos como si se hubiera escrito en la solicitud.

+0

funciona, pero por qué "test.sh fiesta de" no establecer la variable de entorno? Si bash ejecuta cada comando en el script como si estuviera escrito en el prompt, la variable de entorno se establecería en el proceso actual. – GDICommander

+2

@GDICommander: No. Cuando ejecuta 'bash test.sh', esto crea un nuevo proceso' bash' que ejecuta el script ** y sale **. – NPE

+1

Ok, gracias por la información. Ahora, entiendo las variables de entorno un poco mejor. – GDICommander

3

Otra alternativa sería que el guión las variables que desea establecer, con echo export VAR=value y hacer eval "$(./test.sh)" en la shell principal. Este es el enfoque utilizado por varios programas [p. resize, dircolors] que proporcionan variables de entorno para establecer.

Esto sólo funciona si el guión no tiene otra salida (o si aparece cualquier otra salida en stderr, con >&2)

+0

¿Por qué el voto a favor? Este es un patrón común y tiene varias ventajas. – Random832

+0

Esto no funcionó para mí. Lo siento. – FractalSpace

Cuestiones relacionadas