Diferencia entre las variables de shell que se exportan y las que no están en bash

41

Bash parece diferenciar entre las variables que se han exportado y las que no.

ejemplo:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

setve la variable pero envno la ve.

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

setve ambas variables pero envsolo ve la variable exportada.

Sé que setes un bash incorporado y envno lo es.

¿Cuáles son las diferencias entre las variables que se exportan y las que no?

lesmana
fuente
17
Nota de terminología: siempre se exporta una "variable de entorno". Una variable no exportada es una "variable de shell" (o "parámetro").
Gilles 'SO- deja de ser malo'

Respuestas:

44

Las variables exportadas se llevan al entorno de los comandos ejecutados por el shell que las exportó, mientras que las variables no exportadas son locales a la invocación actual del shell. Desde la exportpágina del manual:

El shell dará el atributo de exportación a las variables correspondientes a los nombres especificados, lo que hará que se encuentren en el entorno de los comandos ejecutados posteriormente.

setgenera el entorno actual, que incluye cualquier variable local no exportada. envse utiliza para iniciar programas en un nuevo entorno, y sin argumentos generará cuál sería ese nuevo entorno. Dado que envestá creando un nuevo entorno, solo se traen las variables exportadas, como es el caso de cualquier programa lanzado desde ese shell. Por ejemplo, engendrando un segundo shell dentro del primero (solía $$representar mensajes en el shell interno):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

Tenga en cuenta que se exporta la variable, no solo su valor. Esto significa que una vez que export FOO, FOOse convierte en una variable global y se muestra en entornos posteriores, aunque más tarde cambió:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$
Michael Mrozek
fuente
entonces, si solo le preocupa el shell actual, ¿necesita exportar? Por separado, ¿ localepor qué el shell actual no muestra las actualizaciones?
Pacerier