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

4878
Adam Matan

В чем разница между:

a=b 

а также

export a=b 

В баш?

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

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

4 ответа на вопрос

50
Mike McQuaid

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.

Actually, if you don't use "`export`", you're not defining an environment variable, but just a shell variable. Shell variables are only available to the shell process; environment variables are available to *any* subsequent process, not just shells. In addition, subshells are commands contained within parentheses, which do have access to shell variables, whereas what you're talking about are child processes that happen to be shells. wfaulk 15 лет назад 31
Где они хранятся? HDave 11 лет назад 0
27
wfaulk

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

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

2
alok

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

Файл a.ksh это -

#!/bin/ksh FOO=bar 

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

> . a.ksh 

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

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

> a.ksh 

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

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

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

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

Похожие вопросы