Cada processo tem vários atributos que o processo pode definir individualmente e independentemente de outros processos. Exemplos são limites de recursos, umask, diretório atual, variáveis de ambiente e mais alguns. Na criação do processo (por meio da chamada do sistema fork()
), o filho herda esses atributos do pai. Depois disso, o processo filho pode definir esses atributos arbitrariamente. (Algumas restrições se aplicam, um processo pode não aumentar os limites de recursos rígidos ou alterar seu diretório atual para um diretório para o qual não tenha permissão de execução.)
Apenas alguns programas modificam suas variáveis de ambiente, a maioria não se incomoda. Suponha o último caso. Portanto, se um processo filho criar filhos adicionais, esses processos terão as mesmas variáveis de ambiente que o avô. E assim por diante.
Agora, um shell tem muitas variáveis que podem ser visualizadas com set
(em shells do tipo Bourne Shell, não sei sobre o C Shell). Essas variáveis não são variáveis de ambiente, a menos que sejam export
ed. As variáveis de ambiente podem ser visualizadas com env
. Se você iniciar um programa a partir da linha de comando do shell, o programa herdará as variáveis de ambiente do shell. Da mesma forma, para um programa iniciado a partir de um script de shell.
Portanto, no login, há um shell que lê os dados do perfil (por exemplo, ~/.profile
) e os herda para praticamente todos os filhos, netos e assim por diante. É assim que as configurações da variável de ambiente gotejam do shell de login ou script de login para todos os outros programas iniciados dentro da sessão de login.
I created a environment variable in one terminal window and tried to echo it in another terminal window. That displayed nothing.
Pela explicação acima, este é o resultado esperado. Mudanças no ambiente de um processo afetam apenas os filhos deste processo que são criados a partir de agora, e não os existentes.
$TEST=hello
É improvável que isso funcione de qualquer maneira, a menos que a expansão de variáveis esteja desativada ou $TEST
já tenha um valor adequado. Se você quiser atribuir hello
à variável TEST
, deverá informar TEST=hello
(nota: no $
).
After that I exported it and tried again to echo
it in a different terminal window. result was same as before.
Mais uma vez, este é o resultado esperado.
but if I execute the same code at the login (appending the code to ~/.profile
file) variables can be used any terminal window.
Isso ocorre porque o shell no terminal é um descendente do shell que leu as configurações de ambiente de ~/.profile
e, portanto, herdou essas configurações.