Diferença entre variável de ambiente e variável de shell

8

Dizem que variáveis ​​de ambiente são herdadas em processos filhos, mas variáveis ​​de shell não. No entanto, o teste a seguir mostra que variáveis ​​de shell são vistas no processo filho, assim como variáveis ​​de ambiente. Qual é a diferença?

> bash --version
GNU bash, version 3.2.39(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
> export TEST="ENV_TEST"    #env var
> sh -c "echo \$TEST"
ENV_TEST
> TEST="SHELL_TEST"         #shell var
> sh -c "echo \$TEST"       #shell var is seen in child process
SHELL_TEST
ning
fonte

Respostas:

9

Sua segunda atribuição TEST="SHELL_TEST"não exporta a variável. Ainda está marcado como "a ser herdado por crianças". E o valor herdado pelo filho é o valor atualmente definido no pai.
Em outras palavras, sua segunda atribuição não reverte o status de TESTuma variável de shell, ainda é uma variável de ambiente de acordo com essa terminologia.

Você precisaria desexportá-lo para que ele não seja definido nos processos filhos:

$ typeset +x TEST
$ sh -c 'echo $TEST'

$
Esteira
fonte
Oi Mat, obrigado pela sua resposta. Portanto, meu entendimento (existem duas variáveis ​​denominadas TEST, uma para variável de ambiente e outra para variável de shell, shell var TEST sombreia var var TEST.) Está incorreto, há apenas uma variável no Bash, é sempre uma variável de shell e pode ser definido para ser exportado e atua como uma variável de ambiente. Isso é específico do Bash e depende da implementação, ou é universal em todos os shells. Obrigado.
ning
Não tenho certeza sobre "universal", mas funciona da mesma forma com bash, ksh e zsh pelo menos.
Mat
2
É assim que funcionam todos os shells modernos no estilo POSIX / Bourne (ash, ksh, bash, zsh). Havia versões antigas do shell Bourne em que alterar uma variável do shell exportada não alterava o valor no ambiente, mas é improvável que você as encontre mais. O Csh funciona de maneira diferente, você ainda pode encontrar isso em ambientes antiquados, mas ele também está obsoleto há um tempo.
Gilles 'SO- stop be evil'
@Gilles Obrigado por deixar claro o que está acontecendo e por quê. Como alguém disse, todo desenvolvedor de Unix também deve ser um historiador.
ning