Что делает "экспорт" в программировании оболочки?

Насколько я могу судить, назначение переменной одинаково, если ему предшествует "экспорт" или ему не предшествует. Для чего это?

Ответ 1

Экспортируемые переменные (например, $HOME и $PATH) доступны для других программ. Обычные (не экспортируемые) переменные недоступны для других программ.

$ env | grep '^variable='
$                                 # No environment variable called variable
$ variable=Hello                  # Create local (non-exported) variable with value
$ env | grep '^variable='
$                                 # Still no environment variable called variable
$ export variable                 # Mark variable for export to child processes
$ env | grep '^variable='
variable=Hello
$
$ export other_variable=Goodbye   # create and initialize exported variable
$ env | grep '^other_variable='
other_variable=Goodbye
$

Для получения дополнительной информации см. запись для export builtin в руководстве GNU Bash.

Обратите внимание, что неэкспортированные переменные будут доступны для подоболочек, выполняемых через ( ... ) и аналогичные обозначения:

$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$

Подселл не может влиять на переменную в родительской оболочке, конечно.

Некоторая информация о подоболочках содержится в разделе группировка команд и среда выполнения команд в руководстве Bash.

Ответ 3

Ну, это вообще зависит от оболочки. Для bash он отмечает переменную как "экспортируемую", что означает, что она будет отображаться в среде для любых дочерних процессов, которые вы запускаете.

Неэкспортные переменные видны только из текущего процесса (оболочки).

На странице bash man:

export [-fn] [name[=word]] ...
export -p

Поставляемые имена помечены для автоматического экспорта в среду выполненных впоследствии команд.

Если указана опция -f, имена относятся к функциям. Если имена не указаны или включена опция -p, выводится список всех имен, экспортируемых в эту оболочку.

Параметр -n заставляет свойство экспорта удаляться из каждого имени.

Если за именем переменной следует =word, значение переменной равно word.

export возвращает статус выхода 0, если не встречается недопустимая опция, одно из имен не является допустимым именем переменной оболочки, или -f поставляется с именем, которое не является функцией.

Вы также можете установить переменные как экспортируемые с помощью команды typeset и автоматически пометить все будущие творения или модификации как таковые, с помощью set -a.

Ответ 4

Экспортированная переменная доступна для всех процессов в иерархии процессов. Например, данные, экспортируемые дочерним процессом, доступны для родительского процесса и наоборот.

Основным вариантом использования экспорта является обмен данными между двумя процессами.