Diferença entre variáveis de ambiente e variáveis de ambiente exportadas no bash

37

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

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 variáveis que são exportadas e aquelas que não são?

    
por lesmana 26.10.2010 / 00:15

1 resposta

41

As variáveis exportadas são transportadas para o ambiente de processos iniciados pelo shell que as exportou, enquanto as variáveis não exportadas são locais apenas para o processo atual. Na página export man:

The shell shall give the export attribute to the variables corresponding to the specified names, which shall cause them to be in the environment of subsequently executed commands.

set gera o ambiente atual, o que inclui quaisquer variáveis locais não exportadas. env é usado para iniciar programas em um novo ambiente e, sem argumentos, produzirá o que esse novo ambiente seria. Como env está criando um novo ambiente, apenas variáveis exportadas são trazidas, como é o caso de qualquer programa iniciado a partir desse shell. Por exemplo, gerando 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
$$

Editado para mostrar que é a variável que é exportada, não o valor. Quando 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
$$
    
por 26.10.2010 / 00:25