it-swarm-es.tech

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

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

set ve la variable pero env no.

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

set ve ambas variables pero env ve solo la variable exportada.

Sé que set es un bash incorporado y env no lo es.

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

46
lesmana

Las variables exportadas se llevan al entorno de 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 página del manual export:

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.

set genera el entorno actual, que incluye cualquier variable local no exportada. env se usa para iniciar programas en un nuevo entorno, y sin argumentos dará como resultado ese nuevo entorno. Como env está 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 (usé $$ para 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, FOO se convierte en una variable global y aparece en entornos posteriores, incluso si se cambia más tarde:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$
45
Michael Mrozek