45

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

a=b

а также

export a=b

В баш?

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

4 ответа4

50

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 .

27

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

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

2

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

Файл a.ksh это -

#!/bin/ksh
FOO=bar

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

> . a.ksh

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

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

> a.ksh

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

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .