Respostas:
Para shells compatíveis com POSIX (incluindo Bash), o padrão diz:
2.5.3 Variáveis Shell As
variáveis devem ser inicializadas a partir do ambiente [...] Se uma variável é inicializada a partir do ambiente, ela deve ser marcada para exportação imediatamente; veja o especial de exportação embutido. Novas variáveis podem ser definidas e inicializadas com atribuições de variáveis, [etc.]
E sobre export
:
export name[=word]...
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.
Portanto, do ponto de vista do shell, existem apenas variáveis. Alguns deles podem ter vindo do ambiente quando o shell foi iniciado, e alguns deles podem ser exportados para o ambiente dos processos que o shell inicia.
(O "ambiente" é realmente apenas um monte de strings passadas para o processo quando ele é iniciado. Quando o processo está em execução, ele pode fazer o que quiser com isso, usá-lo, ignorá-lo, substituí-lo. E o que um processo passa quando iniciar outros processos pode ser outra coisa, é claro que é comum passar todas as variáveis de ambiente novamente.)
Se você estava usando algum shell não POSIX, como csh
, as coisas podem ser diferentes:
$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
Essas são a mesma variável. No shell, ao contrário da maioria das outras linguagens de programação, variáveis de ambiente e variáveis de shell compartilham o mesmo espaço de nome. No shell, uma variável de ambiente é uma variável do shell que foi exportada export
.
Veja, por exemplo, minha resposta à sua pergunta anterior " Qual é a diferença de uso entre variáveis de shell e variáveis de ambiente? "
A variável Shell pode ser usada apenas para o shell atual, não pode ser usada em todo o sistema. Por outro lado, a variável ambiental pode ser usada em todo o sistema. Por convenção, a variável de shell é gravada em minúscula, enquanto a variável de ambiente é gravada em maiúscula. Você pode fazer uma variável de shell funcionar como uma variável de ambiente, basta exportá-la.