Cada processo possui vários atributos que o processo pode definir de forma individual e independente de outros processos. Exemplos são limites de recursos, umask, diretório atual, variáveis de ambiente e muito mais. Na criação do processo (por meio da fork()
chamada do sistema), 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 físicos ou alterar seu diretório atual para um diretório para o qual ele não tem 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 mais filhos, esses processos terão as mesmas variáveis de ambiente do avô. E assim por diante.
Agora, um shell tem muitas variáveis que podem ser visualizadas 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
editadas. 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 shell script.
Portanto, no login, existe 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 das variáveis de ambiente passam do shell de login ou do script de login para todos os outros programas iniciados na sessão de login.
Criei uma variável de ambiente em uma janela do terminal e tentei repeti-la em outra janela do terminal. Isso não mostrou nada.
Pela explicação acima, este é o resultado esperado. As mudanças no ambiente de um processo afetam apenas os filhos desse processo que são criados a partir de agora, e não os existentes.
$TEST=hello
É improvável que funcione de qualquer maneira, a menos que a expansão variável esteja desabilitada ou $TEST
já tenha um valor adequado. Se você deseja atribuir hello
à variável TEST
, é necessário dizer TEST=hello
(nota: não $
).
Depois disso, eu o exportei e tentei novamente echo
em uma janela de terminal diferente. resultado foi o mesmo de antes.
Mais uma vez, este é o resultado esperado.
mas se eu executar o mesmo código no logon (acrescentando o código ao ~/.profile
arquivo), as variáveis poderão ser usadas em qualquer janela do terminal.
Isso ocorre porque o shell no terminal é um descendente do shell que lê as configurações do ambiente ~/.profile
e, portanto, herdou essas configurações.