As variáveis globais vivem do momento em que são configuradas até o momento em que são desativadas ou o processo é encerrado. Variáveis globais (nem locais) não são herdadas por processos filhos não relacionados (se o processo filho for um fork (um subshell), ele obtém uma cópia de tudo - exportado ou não).
Variáveis globais exportadas são como variáveis globais, mas também são automaticamente herdadas (como parte do ambiente de processo) por processos filhos, mesmo que não relacionados. (Com as exportações, você pode passar uma variável como CXXFLAGS
para um processo como make
, que definitivamente não é uma subcamada de seu shell, e todo processo que make
gera também obterá essa variável também .)
No seu exemplo, ()
cria uma subshell, que obtém uma cópia de tudo.
O comando foo
modifica a subshell adicionando uma variável exportada e, em seguida, a subshell termina sem nunca utilizar a variável exportada (nenhum neto a herdou). Agora, nenhuma informação viaja implicitamente de processos filhos para processos pai. O que as crianças fazem em seu ambiente não afeta seus pais. Essa é a razão pela qual sua variável one
não está definida.
BTW, esses eval
s são eval
desnecessários neste contexto.