Ответ 1
Каждый процесс, даже в Windows, имеет блок памяти, известный как блок среды, в котором содержатся переменные среды. Когда новый процесс создается, по умолчанию блок среды родительского процесса копируется в дочерний процесс, поэтому переменные среды - это простой способ передачи текстовых данных в дочерний процесс.
Команда export
создает переменную окружения или преобразует обычную локальную переменную в переменную среды. В C-оболочке одна из немногих функций искупления заключается в том, что для локальных переменных (set
) используется другой синтаксис для переменных среды (setenv
). Производные оболочки Bourne, такие как Bash и оболочка Korn, скрывают все это.
В настоящее время могут передаваться только простые значения, поэтому такие элементы, как массивы, не поддерживаются (он просто экспортирует первый элемент). Атрибуты переменной, устанавливаемые с помощью define
, также не экспортируются, если дочерний процесс не является оболочкой того же типа, то есть другой экземпляр bash. Это также относится к экспортированным функциям, хотя иногда их можно взломать между оболочками разных типов (используя eval
).
В Bash (и других) существует параметр оболочки, называемый allexport
, что означает, что все переменные являются переменными окружения - вероятно, плохая идея для общего назначения. Вы можете предоставить другой блок среды из таких языков, как C, используя execve
, но из командной оболочки вам понадобится программа типа env
, подробнее см. man env
.