Что делает команда «экспорт»?

85

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

Недавно я начал работать с Дженкинсом , а затем мне пришлось использовать эту exportкоманду для запуска военного архива Дженкинса . Поэтому мне нужно было знать, что exportвообще делает команда и почему нам нужно запускать эту команду при запуске Jenkins (после того, как установлен дом Jenkins).

Благодарность!

Чатура Куласингхе
источник
1
Было бы полезно, если бы вы сказали больше об используемой команде экспорта. Без дополнительного контекста, я бы предположил, что вы устанавливали переменную среды. См. En.wikipedia.org/wiki/Environment_variable#Unix
Джошуа Д. Бойд
возможный дубликат команды экспорта unix
Джон Кугельман 07

Ответы:

99

exportin shи связанных оболочках (например, bash), отмечает переменную среды, которая будет экспортирована в дочерние процессы, чтобы потомок их унаследовал.

exportопределено в POSIX :

Оболочка должна предоставить атрибут экспорта переменным, соответствующим указанным именам, что должно привести к их нахождению в среде последующих выполняемых команд. Если за именем переменной следует = word, тогда значение этой переменной должно быть установлено в word.

Янн Рамин
источник
Большое спасибо! Все ваши ответы были действительно полезными, и они также помогают узнать еще несколько вещей! :-)
Chathura Kulasinghe
1
Что в этом смысле дочерний процесс?
Zinan Xing
13
Не понимаю
Мартин Хансен
@MartinHansen, чего ты не понимаешь? также см. мой ответ.
barlop 02
В конце ссылки есть лишняя квадратная скобка, я не могу ее редактировать, потому что это
Радослав Стоянов
27

Я предполагаю, что вы исходите из фона Windows. Я сравню их (я тоже новичок в Linux). Я обнаружил, что ответ пользователя на мой комментарий был полезен при выяснении ситуации.

В Windows переменная может быть постоянной или нет. Термин «Переменная среды» включает в себя переменную, установленную в оболочке cmd с помощью команды SET, а также когда переменная устанавливается в графическом интерфейсе Windows, таким образом устанавливается в реестре и становится доступной для просмотра в новых окнах cmd. например, документация для команды set в Windows https://technet.microsoft.com/en-us/library/bb490998.aspx «Отображает, устанавливает или удаляет переменные среды. При использовании без параметров set отображает текущие настройки среды». В Linux set не отображает переменные среды, он отображает переменные оболочки, которые он не вызывает / не называет переменными среды. Кроме того, Linux не использует набор для установки переменных (кроме позиционных параметров и опций оболочки, которые я объясняю в виде примечания в конце), только для их отображения и даже тогда только для отображения переменных оболочки. Windows использует set для настройки и отображения, например, set a = 5, linux - нет.

В Linux, я думаю, вы могли бы создать сценарий, который устанавливает переменные при загрузке, например, /etc/profileили, в /etc/.bashrcпротивном случае, они не постоянные. Они хранятся в оперативной памяти.

В Linux существует различие между переменными оболочки и переменными среды. В Linux переменные оболочки находятся только в текущей оболочке, а переменные среды находятся в этой оболочке и во всех дочерних оболочках.

Вы можете просматривать переменные оболочки с помощью setкоманды (хотя обратите внимание, что в отличие от Windows, переменные не устанавливаются в Linux с помощью команды set).

set -o posix; set (выполнение этого set -o posix один раз помогает не отображать слишком много ненужного). Так setотображаются переменные оболочки.

Вы можете просмотреть переменные среды с помощью envкоманды

переменные оболочки устанавливаются, например, просто a = 5

переменные среды устанавливаются с помощью экспорта, экспорт также устанавливает переменную оболочки

Здесь вы видите переменную оболочки zzz, установленную с zzz = 5, и видите, что она отображается при запуске, setно не отображается как переменная среды.

Здесь мы видим yyy, установленный с экспортом, так что это переменная среды. И посмотрите, как это отображается как в переменных оболочки, так и в переменных среды

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

другие полезные темы

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/environment-variable-vs-shell-variable-whats-the-difference

Обратите внимание: один момент, который немного уточняет и несколько корректирует то, что я написал, заключается в том, что в linux bash 'set' можно использовать для установки «позиционных параметров» и «параметров / атрибутов оболочки», и технически обоих из это переменные, хотя страницы руководства могут не описывать их как таковые. Но все же, как уже упоминалось, set не устанавливает переменные оболочки или переменные среды). Если вы это сделаете, set asdfон установит $ 1 в asdf, а если вы это сделаете, echo $1вы увидите asdf. Если вы это сделаетеset a=5он не установит переменную a равной 5. Он установит позиционный параметр $ 1 равным строке «a = 5». Так что, если вы когда-либо видели установку a = 5 в Linux, это, вероятно, ошибка, если только кто-то действительно не хотел, чтобы строка a = 5 в $ 1. Другая вещь, которую может установить набор linux, - это параметры / атрибуты оболочки. Если вы установите -o, вы увидите их список. И вы можете, например set -o verbose, выключить, чтобы включить подробный отчет (кстати, по умолчанию он выключен, но это не имеет значения). Или вы можете сделать, set +o verboseчтобы отключить подробные сведения. Windows не имеет такого использования для своей команды set.

барлоп
источник
похоже, что set показывает оболочку и среду, а env показывает только среду
barlop
1
Мне нравится этот ответ, поскольку он охватывает случаи nix vs win, которые поначалу могут сбивать с толку.
N0thing
6

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

катвекибы
источник
1
Но если я скажу, a=5тогда echo $aбудет сказано 5. Тем не менее, вы написали: «В любой момент, если вы измените какое-либо значение переменной, оболочка не сможет выбрать это изменение. Это означает, что внесенные вами изменения вступят в силу в новых сеансах оболочки». . <- Так как же он обновил сессию оболочки без экспорта. Можете привести пример, где нужен экспорт?
barlop 08
Переменная, которую вы устанавливаете во время сеанса оболочки, является переменной оболочки. он локален и доступен для текущего сеанса оболочки. вы можете изменить его в любое время, и его текущее значение будет доступно текущему процессу оболочки без необходимости экспортировать изменения. с другой стороны, переменные среды устанавливаются во время входа в систему. когда вы меняете какое-либо из их значений, вам необходимо выполнить то, что простыми словами было бы обновлением, сделав новое значение доступным как для текущего процесса оболочки, так и для любых новых дочерних процессов. это именно то, что делает экспорт.
katwekibs 09