Разница между «a = b» и «export a = b» в bash

50

Какая разница между:

a=b

а также

export a=b

В баш?

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

Адам Матан
источник
Может кто-нибудь, пожалуйста, отредактируйте это? Это совсем не связано с Linux, а зависит только от используемой вами оболочки. Я полагаю, это bash, который также работает на Windows.
InnaM
Я стою исправлено.
Адам Матан

Ответы:

54

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

Например, если вы сделали

FOO=bar

тогда подпроцесс, который проверил FOO, не найдет переменную, тогда как

export FOO=bar

позволит подпроцессу найти его.

Но если FOOона уже была определена как переменная среды, она FOO=barизменит значение этой переменной среды.

Например:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Старые оболочки не поддерживали export FOO=barсинтаксис; ты должен был написать FOO=bar; export FOO.

Майк Маккуэйд
источник
33
На самом деле, если вы не используете " export", вы определяете не переменную окружения, а просто переменную оболочки. Переменные оболочки доступны только для процесса оболочки; Переменные среды доступны для любого последующего процесса, а не только для оболочек. Кроме того, подоболочки - это команды, содержащиеся в скобках, которые имеют доступ к переменным оболочки, тогда как речь идет о дочерних процессах, которые оказываются оболочками.
wfaulk
Где они хранятся?
HDave
28

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

Переменные оболочки доступны только для процесса оболочки; Переменные среды доступны для любого последующего процесса, а не только для оболочек.

wfaulk
источник
2

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

Файл a.ksh - это

#!/bin/ksh
FOO=bar

В командной строке запустите это

> . a.ksh

Это запустит команды в той же оболочке, и $ FOO будет доступен.

В то время как,

> a.ksh

Сделает $ FOO доступным только в пределах a.ksh, после вызова a.ksh он не будет существовать.

Alok
источник
1
Верный. Обратите внимание, что "." это просто ярлык для «источника», который иногда используется в сценариях для лучшей читаемости. Смотрите «помощь». или «источник помощи» для деталей.
слеске
1

В дополнение к тому, на что уже был дан ответ, оба эти утверждения не обязательно определяют (то есть создают против набора) переменную среды, поскольку «а» может уже существовать как переменная оболочки или среды.

В последнем случае оба утверждения строго эквивалентны.

jlliagre
источник