Qual é o uso do comando “export”?

8

Eu criei uma variável de ambiente em uma janela de terminal e tentei ecoar em outra janela de terminal. Isso não mostrou nada.

$TEST=hello

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

export TEST 

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 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?

    
por DScript 14.06.2015 / 16:55

2 respostas

22

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 há como definir uma variável em um terminal e fazer com que apareça automaticamente em outro terminal, o ambiente é estabelecido para cada processo por conta própria.

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

    
por 14.06.2015 / 17:00
1

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.

    
por 20.10.2016 / 23:14