Я собираюсь написать script и, похоже, нет никакой разницы между:
export k=1
и
k=1
Я прав?
Я собираюсь написать script и, похоже, нет никакой разницы между:
export k=1
и
k=1
Я прав?
Каждый процесс, даже в Windows, имеет блок памяти, известный как блок среды, в котором содержатся переменные среды. Когда новый процесс создается, по умолчанию блок среды родительского процесса копируется в дочерний процесс, поэтому переменные среды - это простой способ передачи текстовых данных в дочерний процесс.
Команда export
создает переменную окружения или преобразует обычную локальную переменную в переменную среды. В C-оболочке одна из немногих функций искупления заключается в том, что для локальных переменных (set
) используется другой синтаксис для переменных среды (setenv
). Производные оболочки Bourne, такие как Bash и оболочка Korn, скрывают все это.
В настоящее время могут передаваться только простые значения, поэтому такие элементы, как массивы, не поддерживаются (он просто экспортирует первый элемент). Атрибуты переменной, устанавливаемые с помощью define
, также не экспортируются, если дочерний процесс не является оболочкой того же типа, то есть другой экземпляр bash. Это также относится к экспортированным функциям, хотя иногда их можно взломать между оболочками разных типов (используя eval
).
В Bash (и других) существует параметр оболочки, называемый allexport
, что означает, что все переменные являются переменными окружения - вероятно, плохая идея для общего назначения. Вы можете предоставить другой блок среды из таких языков, как C, используя execve
, но из командной оболочки вам понадобится программа типа env
, подробнее см. man env
.
export
делает переменную доступной для подпроцессов.
То есть, если вы создадите новый процесс из вашего script, переменная k
не будет доступна для этого подпроцесса, если вы не export
. Обратите внимание: если вы измените эту переменную в подпроцессе, это изменение не будет видно в родительском процессе.
Подробнее см. раздел 3.2.3 этого документа.
Я создал простой script, чтобы показать разницу:
$ cat script.sh
echo $answer
Пусть тест без export
$ answer=42
$ ./script.sh
$ . script.sh
42
Значение известно только при использовании одного и того же процесса для выполнения script (то есть того же экземпляра bash
, используя source
/.
)
Теперь, используя export
:
$ export answer=42
$ ./script.sh
42
$ . script.sh
42
Значение известно подпроцессу.
Таким образом, если вы хотите, чтобы значение переменной было известно подпроцессам, вы должны использовать export
.