Подтвердить что ты не робот

BASH: разница между "export k = 1" и "k = 1"

Я собираюсь написать script и, похоже, нет никакой разницы между:

export k=1

и

k=1

Я прав?

4b9b3361

Ответ 1

Каждый процесс, даже в Windows, имеет блок памяти, известный как блок среды, в котором содержатся переменные среды. Когда новый процесс создается, по умолчанию блок среды родительского процесса копируется в дочерний процесс, поэтому переменные среды - это простой способ передачи текстовых данных в дочерний процесс.

Команда export создает переменную окружения или преобразует обычную локальную переменную в переменную среды. В C-оболочке одна из немногих функций искупления заключается в том, что для локальных переменных (set) используется другой синтаксис для переменных среды (setenv). Производные оболочки Bourne, такие как Bash и оболочка Korn, скрывают все это.

В настоящее время могут передаваться только простые значения, поэтому такие элементы, как массивы, не поддерживаются (он просто экспортирует первый элемент). Атрибуты переменной, устанавливаемые с помощью define, также не экспортируются, если дочерний процесс не является оболочкой того же типа, то есть другой экземпляр bash. Это также относится к экспортированным функциям, хотя иногда их можно взломать между оболочками разных типов (используя eval).

В Bash (и других) существует параметр оболочки, называемый allexport, что означает, что все переменные являются переменными окружения - вероятно, плохая идея для общего назначения. Вы можете предоставить другой блок среды из таких языков, как C, используя execve, но из командной оболочки вам понадобится программа типа env, подробнее см. man env.

Ответ 2

export делает переменную доступной для подпроцессов.

То есть, если вы создадите новый процесс из вашего script, переменная k не будет доступна для этого подпроцесса, если вы не export. Обратите внимание: если вы измените эту переменную в подпроцессе, это изменение не будет видно в родительском процессе.

Подробнее см. раздел 3.2.3 этого документа.

Ответ 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.