Bash, кажется, различает переменные, которые были экспортированы, и переменные, которые не были экспортированы.
пример:
$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR
set
видит переменную, но env
не видит .
$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR
set
видит обе переменные, но env
видит только экспортированную переменную.
Я знаю, что set
это встроенный Bash, а env
не.
Каковы различия между переменными, которые экспортируются, и переменными, которые не экспортируются?
shell
environment-variables
lesmana
источник
источник
Ответы:
Экспортируемые переменные переносятся в среду команд, выполняемых оболочкой, которая их экспортировала, в то время как неэкспортированные переменные являются локальными для текущего вызова оболочки. Со
export
страницы руководства :set
выводит текущую среду, которая включает в себя все локальные неэкспортированные переменные.env
используется для запуска программ в новой среде и без аргументов выведет, какой будет эта новая среда. Посколькуenv
создается новая среда, передаются только экспортированные переменные, как в случае любой программы, запускаемой из этой оболочки. Например, порождение второй оболочки внутри первой (я использовал$$
для представления подсказок во внутренней оболочке):Обратите внимание, что экспортируется переменная, а не только ее значение. Это означает, что, как только вы
export FOO
,FOO
становитесь глобальной переменной и отображаются в последующих средах, даже если изменились позже:источник
locale
для текущей оболочки не показывать обновления?