Qual é o uso do comando "export"?

12

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.

$TEST=hello

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

export TEST 

mas se eu executar o mesmo código no logon (acrescentando o código ao ~/.profilearquivo), as variáveis ​​poderão ser usadas em qualquer janela do terminal. O que esta acontecendo aqui? Qual é a diferença entre executar um código em um terminal e executar o mesmo no login?

DScript
fonte

Respostas:

25

exporttorna uma variável algo que será incluído nos 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 si próprio.

Adicioná-lo ao seu .profilefaz com que o seu ambiente seja configurado para incluir essa nova variável sempre que você efetuar login. Portanto, ele não está sendo exportado de um shell para outro, mas está instruindo um novo shell a incluí-lo quando configurar o ambiente inicial.

Eric Renouf
fonte
1

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 exporteditadas. 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 $TESTjá 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 echoem 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 ~/.profilearquivo), 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 ~/.profilee, portanto, herdou essas configurações.

contra-modo
fonte