Para shells compatíveis com POSIX (incluindo Bash), o padrão diz:
2.5.3 Shell Variables
Variables shall be initialized from the environment [...] If a variable is initialized from the environment, it shall be marked for export immediately; see the export special built-in. New variables can be defined and initialized with variable assignments, [etc.]
E sobre export
:
export name[=word]...
The shell shall give the export attribute to the variables corresponding to the specified names, which shall cause them to be in the environment of subsequently executed commands.
Então, 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 iniciados pelo shell.
(O "ambiente" é realmente apenas um monte de strings passadas para o processo quando ele é iniciado. Quando o processo está rodando, ele pode fazer o que quiser com isso, usá-lo, ignorá-lo, sobrescrevê-lo. E que processo passa ao iniciar outros processos pode ser outra coisa, embora, é claro, é normal 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