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

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

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


person Chathura Kulasinghe    schedule 10.12.2012    source источник
comment
Было бы полезно, если бы вы рассказали больше об используемой вами команде экспорта. Без дополнительного контекста я бы предположил, что вы устанавливали переменную среды. См. en.wikipedia.org/wiki/Environment_variable#Unix.   -  person Joshua D. Boyd    schedule 10.12.2012
comment
возможный дубликат bash: определение переменной с экспортом или без него   -  person tripleee    schedule 10.12.2012
comment
возможный дубликат команды экспорта unix   -  person John Kugelman    schedule 07.08.2013


Ответы (3)


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

export определяется в POSIX:

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

person Yann Ramin    schedule 10.12.2012
comment
Что такое дочерний процесс в этом смысле? - person AsyncMoksha; 11.02.2015

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

В Windows переменная может быть постоянной или нет. Термин переменная среды включает в себя переменную, установленную в оболочке cmd с помощью команды SET, а также когда переменная устанавливается в графическом интерфейсе Windows, то есть устанавливается в реестре, и становится доступным для просмотра в новых окнах cmd.

Например, документация для команды set в Windows Отображает, задает или удаляет переменные среды. При использовании без параметров set отображает текущие настройки среды.

В Linux set не отображает переменные среды. Он отображает переменные оболочки, которые он не вызывает/не называет переменными среды. Кроме того, Linux не использует set для установки переменных (кроме позиционных параметров и опций оболочки, которые я объясню в качестве примечания в конце), только для их отображения и даже тогда только для отображения переменных оболочки. 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.

Переменные среды устанавливаются с помощью export. Экспорт также устанавливает переменную оболочки.

Здесь вы видите переменную оболочки 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

$

Другие полезные QnAs:

Примечание. Один момент, который немного уточняет и несколько корректирует то, что я написал, заключается в том, что в Linux bash «set» может использоваться для установки позиционных параметров и параметров/атрибутов оболочки, и технически оба они являются переменными, хотя справочные страницы могут не описывать их как таковые.

Но все же, как уже упоминалось, set не устанавливает переменные оболочки или переменные среды). Если вы сделаете set asdf, то он установит $1 в asdf, а если вы сделаете echo $1, вы увидите asdf.

Если вы сделаете set a=5, он не установит переменную a равной 5. Он установит позиционный параметр $1 равным строке a=5. Так что, если вы когда-либо видели set a=5 в Linux, это, вероятно, ошибка, если только кто-то действительно не хотел, чтобы строка a=5 находилась в $1.

Другая вещь, которую может установить set в Linux, это параметры/атрибуты оболочки. Если вы установите -o, вы увидите их список. И вы можете сделать, например, set -o verbose, off, чтобы включить многословие (кстати, по умолчанию он выключен, но это не имеет значения). Или вы можете сделать set +o verbose, чтобы отключить подробные сведения. Windows не имеет такого использования для своей команды set.

person barlop    schedule 16.07.2015
comment
похоже, что набор показывает оболочку и среду, а «env» показывает только среду - person barlop; 14.12.2015
comment
Этот ответ очень нравится, так как он охватывает случаи nix vs win, которые поначалу могут сбивать с толку. - person N0thing; 24.08.2016

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

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

person katwekibs    schedule 16.05.2015
comment
Но если я скажу a=5, затем echo $a, тогда будет 5. Тем не менее, вы написали в любое время, если вы измените какое-либо значение переменной, оболочка не сможет выбрать это изменение. это означает, что сделанные вами изменения вступают в силу в новых сеансах оболочки. . ‹-- Итак, как он обновил сеанс оболочки без экспорта. Можете ли вы привести пример, когда экспорт необходим? - person barlop; 08.06.2015
comment
Переменная, которую вы устанавливаете во время сеанса оболочки, является переменной оболочки. он локальный и доступен для текущего сеанса оболочки. вы можете изменить его в любое время, и его текущее значение будет доступно текущему процессу оболочки без необходимости экспортировать изменения. с другой стороны, переменные среды устанавливаются во время входа в систему. когда вы меняете какое-либо их значение, вам нужно выполнить то, что в простом смысле было бы обновлением, делающим новое значение доступным как для текущего процесса оболочки, так и для любых новых дочерних процессов. это именно то, что делает экспорт. - person katwekibs; 09.06.2015