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