2012-09-24 20 views

Respuesta

14

Cada proceso, incluso en Windows, tiene un bloque de memoria conocido como el bloque ambiente, este contiene las variables de entorno . Cuando se crea un nuevo proceso, de forma predeterminada, el bloque de entorno del proceso principal se copia al elemento secundario, por lo que las variables de entorno son una forma sencilla de pasar datos de texto a un proceso secundario.

El comando export crea una variable de entorno o convierte una variable local ordinaria en una variable de entorno. En el C-shell, una de sus pocas características de redención es que utiliza una sintaxis diferente para variables de entorno (setenv) a variables locales (set). Los derivados de Bourne shell, como Bash y Korn shell, ocultan todo eso.

Actualmente, solo se pueden pasar valores simples, por lo que elementos como matrices no son compatibles (solo exporta el primer elemento). Los atributos de variable, establecidos usando define, tampoco se exportan a menos que el proceso hijo sea un shell del mismo tipo, es decir, otra instancia de bash. Esto también se aplica a las funciones exportadas, aunque a veces es posible hackear esto entre shells de diferentes tipos (usando eval).

En Bash (y en otros) hay una configuración de shell llamada allexport, lo que significa que todas las variables son variables de entorno, probablemente una mala idea para ver en general.Puede suministrar un bloque de entorno diferente de idiomas como C usando execve, pero desde el shell necesita un programa como env, consulte man env para obtener más información.

34

export hace que la variable esté disponible para los subprocesos.

Es decir, si genera un nuevo proceso de su secuencia de comandos, la variable k no estará disponible para ese subproceso a menos que export. Tenga en cuenta que si cambia esta variable en el subproceso que cambia , no será visible en el proceso principal.

Consulte la sección 3.2.3 de this doc para obtener más información.

+0

sucinto y al grano. +1 –

18

He creado un script sencillo para mostrar la diferencia:

$ cat script.sh 
echo $answer 

prueba de Let sin export

$ answer=42 
$ ./script.sh 

$ . script.sh 
42 

se conoce el valor sólo si el uso del mismo proceso para ejecutar el script (es decir, la misma instancia de bash, usando source/.)

Ahora, usando export:

$ export answer=42 
$ ./script.sh 
42 
$ . script.sh 
42 

El valor es conocido en el subproceso.

Por lo tanto, si desea que el valor de una variable sea conocido por subprocesos, entonces debe usar export.

Cuestiones relacionadas