Экспортируемые переменные переносятся в среду команд, выполняемых оболочкой, которая их экспортировала, в то время как неэкспортированные переменные являются локальными для текущего вызова оболочки. Со export
страницы руководства :
Оболочка должна предоставлять атрибут экспорта переменным, соответствующим указанным именам, что должно приводить к тому, что они находятся в среде последующих выполняемых команд.
set
выводит текущую среду, которая включает в себя все локальные неэкспортированные переменные. env
используется для запуска программ в новой среде и без аргументов выведет, какой будет эта новая среда. Поскольку env
создается новая среда, передаются только экспортированные переменные, как в случае любой программы, запускаемой из этой оболочки. Например, порождение второй оболочки внутри первой (я использовал $$
для представления подсказок во внутренней оболочке):
$ FOO=BAR
$ bash
$$ echo $FOO # Note the empty line
$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$
Обратите внимание, что экспортируется переменная, а не только ее значение. Это означает, что, как только вы export FOO
, FOO
становитесь глобальной переменной и отображаются в последующих средах, даже если изменились позже:
$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$