Что делает экспорт в BASH? [Дубликат]

75

Возможный дубликат:
разница между «a = b» и «export a = b» в bash

Трудно признать, но я никогда не понимал, что именно exportделает переменную окружения. Я знаю, что если я не экспортирую переменную, я иногда не вижу ее в дочерних процессах, но иногда кажется, что могу. Что на самом деле происходит, когда я говорю

export foo=5

и когда я не должен экспортировать переменную?

Чес. Owens
источник
Вот ссылка, по крайней мере, на еще один полезный вопрос на эту тему: superuser.com/questions/143413/linux-environment-variables ... поскольку по иронии судьбы этот вопрос был первым, который появился в Google для моего запроса об экспорте в bash ,
Огр Псалом 33
1
Также: superuser.com/questions/18988/…
Ogre Psalm33
Одним из распространенных применений является добавление exportоператоров в .bashrc / .bash_profile для создания постоянных глобальных переменных, аналогичных $HOME.
Эван Плейс
Осторожнее, в этой истории есть нечто большее, чем кажется на первый взгляд. Я приглашаю вас проверить мой ответ.
Jasonleonhard

Ответы:

15

От man bash:

ОКРУЖАЮЩАЯ ОБСТАНОВКА

Когда программа вызывается, ей присваивается массив строк, называемый окружением. Это список пар имя-значение в формате имя = значение.

Оболочка предоставляет несколько способов манипулирования средой. При вызове оболочка сканирует свою собственную среду и создает параметр для каждого найденного имени, автоматически помечая его для экспорта в дочерние процессы. Выполненные команды наследуют среду. export И declare -x команды позволяют параметры и функции , которые будут добавлять и удалять из окружающей среды. Если значение параметра в среде изменяется, новое значение становится частью среды, заменяя старое. Среда, унаследованная любой исполняемой командой, состоит из начальной среды оболочки, значения которой могут быть изменены в оболочке, за исключением любых пар, удаленных unset командой, а также любых дополнений с помощью declare -xкоманд export и .

SML
источник
74
ИМХО вставлять копию выдержки из документации без каких-либо дополнительных усилий объяснения не следует.
Артур
30
Этот отрывок не очень понятен, и, честно говоря, я не понял, что происходит.
Трисмегистос
4
@Artur: наоборот: если (отрывок из) документации ответит на вопрос, я бы предпочел не иметь дополнительных объяснений.
Рене Ниффенеггер,
1
@ RenéNyffenegger, но, похоже, нет. По крайней мере, я не получил его, пока не прочитал ответ BloodPhilia, который должен быть помечен как принятый.
Владислав Раструсный
1
Я считаю, что Артур и Трисмегистос высказывали мнение, что каждый может скопировать пасту, но этого не всегда достаточно, уточнить и дать хороший ответ. Можно скопировать, вставить некоторую документацию или предоставить ссылку, на самом деле это поощряется, но должно быть какое-то дополнительное качественное объяснение. Кроме того, это объяснение может быть легко проигнорировано такими людьми, как РенеНифенеггер, если оно им не нужно, но оно будет там для тех, кто извлечет из этого пользу. Мы все пытаемся учиться и по-разному понимаем это, это помогает охватить различные стили обучения и повысит ваш рейтинг.
Jasonleonhard
99

Экспортируемые переменные передаются дочерним процессам, а неэкспортированные переменные - нет.

BloodPhilia
источник
Можете ли вы указать на любую документацию, касающуюся этого Я ищу больше информации, чем это. Например, нужно ли экспортировать переменную только один раз, или вам нужно экспортировать ее после каждого изменения и т. Д.
Chas. Оуэнс
1
Вы можете проверить это: superuser.com/questions/143413/linux-environment-variables/…
BloodPhilia
3
Вы можете убедиться в этом, добавив что-то к пути (скажем, в PYTHONPATH), а затем заметив, что, хотя вы можете echo $PYTHONPATHэто сделать, он не распознается скриптами python или bash, пока вы exportне сделаете это
Kaushik Ghose
Этот ответ тоже не совсем правдив. Например, вспомогательные оболочки Bash относятся к дочерним процессам (в соответствии с $BASHPID), и все же вы можете читать неэкспортированные переменные из родительской оболочки. Простое доказательство: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") я предполагаю, что это особый случай, когда дочерний процесс является вложенной оболочкой.
JepZ
20

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

Когда вы завершаете работу оболочки, ее среда уничтожается, поэтому переменные среды объявляются и экспортируются при входе в систему, например, в файле .bashrc.

alfredozn
источник