As variáveis exportadas são transportadas para o ambiente de comandos executados pelo shell que os exportou, enquanto as variáveis não exportadas são locais para a chamada de shell atual. Na export
página do manual:
O shell deve atribuir o atributo export às variáveis correspondentes aos nomes especificados, o que fará com que elas estejam no ambiente de comandos executados posteriormente.
set
gera o ambiente atual, que inclui quaisquer variáveis locais não exportadas. env
é usado para iniciar programas em um novo ambiente e, sem argumentos, produzirá o que seria esse novo ambiente. Como env
está criando um novo ambiente, somente variáveis exportadas são trazidas, como é o caso de qualquer programa iniciado a partir desse shell. Por exemplo, gerando um segundo shell dentro do primeiro (eu costumava $$
representar prompts no shell interno):
$ FOO=BAR
$ bash
$$ echo $FOO # Note the empty line
$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$
Observe que é a variável exportada, não apenas seu valor. Isto significa que uma vez que você export FOO
, FOO
torna-se uma variável global e mostra-se em ambientes posteriores, mesmo se mudou mais tarde:
$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$