¿Qué hace la exportación en BASH? [duplicar]

75

Posible duplicado:
diferencia entre "a = b" y "exportar a = b" en bash

Es difícil de admitir, pero nunca he entendido realmente qué exporthace exactamente a una variable de entorno. Sé que si no exporto una variable, a veces no puedo verla en los procesos secundarios, pero a veces parece que sí puedo. ¿Qué está pasando realmente cuando digo

export foo=5

y cuando no debo exportar una variable?

Chas Owens
fuente
Aquí hay un enlace a al menos otra pregunta útil sobre este tema: superuser.com/questions/143413/linux-environment-variables ... ya que, irónicamente, esta pregunta fue la primera que apareció en Google para mi consulta sobre exportación en bash .
Ogre Psalm33
1
También: superuser.com/questions/18988/...
ogro Psalm33
Un uso común es agregar exportdeclaraciones a .bashrc / .bash_profile para crear variables globales persistentes similares a $HOME.
Evan Plaice
Cuidado, hay más en esta historia de lo que parece inicialmente. Los invito a revisar mi respuesta.
jasonleonhard

Respuestas:

15

De man bash:

AMBIENTE

Cuando se invoca un programa, se le da una serie de cadenas llamadas entorno. Esta es una lista de pares nombre-valor, de la forma nombre = valor.

El shell proporciona varias formas de manipular el entorno. En la invocación, el shell explora su propio entorno y crea un parámetro para cada nombre encontrado, marcándolo automáticamente para exportarlo a procesos secundarios. Los comandos ejecutados heredan el entorno. Los comandos export y declare -xpermiten agregar y eliminar parámetros y funciones del entorno. Si se modifica el valor de un parámetro en el entorno, el nuevo valor se convierte en parte del entorno y reemplaza al antiguo. El entorno heredado por cualquier comando ejecutado consiste en el entorno inicial del shell, cuyos valores pueden modificarse en el shell, menos los pares eliminados por el unset comando, más cualquier adición a través de la exportación y los declare -xcomandos.

sml
fuente
74
En mi humilde opinión, copiar y pegar un extracto de la documentación sin ningún esfuerzo adicional de explicación no debe ser votado.
Artur
30
Ese extracto no es muy claro y, francamente, no entendí lo que está sucediendo.
Trismegistos
44
@Artur: por el contrario: si la (extracto de) la documentación responde una pregunta, prefiero no tener explicaciones adicionales.
René Nyffenegger
1
@ RenéNyffenegger pero parece que no. Al menos, no lo entendí hasta que leí una respuesta de BloodPhilia que debería marcarse como aceptada.
Vladislav Rastrusny
1
Creo que los puntos que Artur y Trismegistos estaban haciendo es que cualquiera puede copiar y pegar, no siempre es suficiente, aclarar y proporcionar una buena respuesta. Está bien copiar, pegar alguna documentación o proporcionar un enlace, de hecho se recomienda, pero debería haber alguna explicación de calidad adicional. Además, esa explicación puede ser fácilmente ignorada por personas como RenéNyffenegger si no la necesitan, pero estará allí para aquellos que se beneficiarán de ella. Todos estamos tratando de aprender y tenemos diferentes formas de obtener comprensión, esto ayuda a cubrir una variedad de estilos de aprendizaje y mejorará su calificación.
jasonleonhard
99

Las variables exportadas se pasan a los procesos secundarios, las variables no exportadas no.

BloodPhilia
fuente
¿Puede señalar cualquier documentación al respecto? Estoy buscando más información que eso. Por ejemplo, ¿una variable solo necesita exportarse una vez, o necesita exportarla después de cada cambio, etc.
Chas. Owens
1
Se podría comprobar esto: superuser.com/questions/143413/linux-environment-variables/...
BloodPhilia
3
Puede verificar esto agregando algo a una ruta (digamos PYTHONPATH) y luego notando que, aunque puede echo $PYTHONPATH, Python o Bash no lo reconoce hasta que usted exportlo haga
Kaushik Ghose
Esta respuesta tampoco parece ser del todo cierta. Las subcapas de bash, por ejemplo, son procesos secundarios (según $BASHPID) y, sin embargo, puede leer variables no exportadas desde la shell principal. Prueba simple: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") supongo que este es un caso especial que ocurre cuando el proceso secundario es un subconjunto.
JepZ
20

Cuando lo usa export, está agregando la variable a la lista de variables de entorno del shell en el que se llamó al comando de exportación y todas las variables de entorno de un shell se pasan a los procesos secundarios, por eso puede usarlo.

Cuando finaliza el shell, su entorno se destruye, por eso las variables de entorno se declaran y exportan al iniciar sesión, por ejemplo, en el archivo .bashrc

alfredozn
fuente