O Bash parece diferenciar entre as variáveis que foram exportadas e as que não foram.
exemplo:
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
set
vê a variável, mas env
não.
$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR
set
vê as duas variáveis, mas env
vê apenas a variável exportada.
Eu sei que set
é um bash embutido e env
não é.
Quais são as diferenças entre as variáveis exportadas e as que não são?
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 atual do Shell. Na página do manual export
:
O Shell 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, gerar um segundo Shell dentro do primeiro (usei $$
para 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. Isso significa que depois que você export FOO
, FOO
se torna uma variável global e aparece em ambientes subseqüentes, mesmo se alterado posteriormente:
$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$