it-swarm-pt.com

Diferença entre variáveis ​​do Shell que são exportadas e aquelas que não estão no bash

O Bash parece diferenciar entre as variáveis ​​que foram exportadas e as que não foram.

exemplo:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

set vê a variável, mas env não.

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

set vê as duas variáveis, mas env vê apenas a variável exportada.

Eu sei que set é um bash embutido e env não é.

Quais são as diferenças entre as variáveis ​​exportadas e as que não são?

46
lesmana

As variáveis ​​exportadas são transportadas para o ambiente de comandos executados pelo Shell que os exportou, enquanto as variáveis ​​não exportadas são locais para a chamada atual do Shell. Na página do manual export:

O Shell atribuirá o atributo export às variáveis ​​correspondentes aos nomes especificados, o que fará com que elas estejam no ambiente de comandos executados posteriormente.

set gera o ambiente atual, que inclui quaisquer variáveis ​​locais não exportadas. env é usado para iniciar programas em um novo ambiente e, sem argumentos, produzirá o que seria esse novo ambiente. Como env está criando um novo ambiente, somente variáveis ​​exportadas são trazidas, como é o caso de qualquer programa iniciado a partir desse Shell. Por exemplo, gerar um segundo Shell dentro do primeiro (usei $$ para representar prompts no Shell interno):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

Observe que é a variável exportada, não apenas seu valor. Isso significa que depois que você export FOO, FOO se torna uma variável global e aparece em ambientes subseqüentes, mesmo se alterado posteriormente:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$
45
Michael Mrozek