Criei uma variável de ambiente em uma janela de terminal e tentei repeti-la em outra janela de terminal. Isso não exibiu nada.

$TEST=hello 

Depois disso, eu exportei e tentei novamente echo em uma janela de terminal diferente . o resultado foi o mesmo de antes.

export TEST 

mas se eu executar o mesmo código no login (anexando o código a ~/.profile arquivo) variáveis podem ser usadas em qualquer janela de terminal. O que esta acontecendo aqui? Qual é a diferença entre executar um código em um terminal e executar o mesmo no login?

Resposta

export torna uma variável algo que será incluído em ambientes de processo filho. Não afeta outros ambientes já existentes. Em geral, não existe “uma maneira de definir uma variável em um terminal e fazê-la aparecer automaticamente em outro terminal, o ambiente é estabelecido para cada processo por conta própria.

Adicionando-o ao seu .profile faz com que seu ambiente seja configurado para incluir essa nova variável cada vez que você efetuar login. Portanto, não está sendo exportado de um shell para outro, mas em vez disso, está instruindo um novo shell para incluir quando ele configura o ambiente inicial.

Resposta

Cada processo tem vários atributos que o processo pode definir individualmente e independentemente dos outros processos. Os exemplos são limites de recursos, umask, diretório atual, variáveis de ambiente e alguns mais. Após a 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 rígidos de recursos ou alterar seu diretório atual para um diretório para o qual não tenha permissão de exec.)

Apenas alguns programas modificam suas variáveis de ambiente, a maioria não se preocupa . Suponha o último caso. Portanto, se um processo filho criar a si mesmo mais filhos, 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 pode ser visualizado com set (em shells do tipo Bourne Shell, não sei sobre C Shell). Essas variáveis não são variáveis de ambiente, a menos que sejam export ed. 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, após o login, há um shell que lê os dados do perfil (por exemplo, ~/.profile) e os herda virtualmente para todos os filhos, netos e assim por diante. É assim que as configurações de variáveis de ambiente fluem do shell de login ou script de login para todos os outros programas iniciados na sessão de login.

Criei uma variável de ambiente em uma janela de terminal e tentou ecoá-lo em outra janela de terminal. Isso não exibiu nada.

Pela explicação acima, este é o resultado esperado. Mudanças no ambiente de um processo afetam apenas os filhos desse processo que são criados daqui em diante, e não os existentes.

$TEST=hello

É improvável que funcione de qualquer maneira, a menos que a expansão da variável esteja desativada ou $TEST já tenha um valor adequado. Se você deseja atribuir hello à variável TEST, você deve dizer TEST=hello (observe : no $).

Depois disso, exportei e tentei novamente para echo em uma janela de terminal diferente. o resultado foi o mesmo de antes.

Mais uma vez, este é o resultado esperado.

mas se eu executar o mesmo código no login (anexando o código ao arquivo ~/.profile), as variáveis podem ser usadas em qualquer janela de terminal.

Isso ocorre porque o shell no terminal é descendente do shell que lê as configurações de ambiente de ~/.profile e, portanto, herdou essas configurações.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *