В чем разница между:
a=b
а также
export a=b
В баш?
Я понимаю, что они оба определяют переменные среды, но я не до конца понимаю разницу.
В чем разница между:
a=b
а также
export a=b
В баш?
Я понимаю, что они оба определяют переменные среды, но я не до конца понимаю разницу.
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
.
Если вы не используете export
, вы не определяете переменную среды; просто переменная оболочки.
Переменные оболочки доступны только для процесса оболочки; Переменные среды доступны для любого последующего процесса, а не только для оболочек.
Также, если вы хотите, чтобы переменная была доступна для вызывающей оболочки без использования экспорта, вы можете сделать это:
Файл a.ksh это -
#!/bin/ksh
FOO=bar
В командной строке запустите это
> . a.ksh
Это запустит команды в той же оболочке, и $ FOO будет доступен.
В то время как,
> a.ksh
Сделает $ FOO доступным только в пределах a.ksh, после вызова a.ksh он не будет существовать.
В дополнение к тому, на что уже был дан ответ, оба эти утверждения не обязательно определяют (то есть создают против набора) переменную среды, поскольку "а" может уже существовать как переменная оболочки или среды.
В последнем случае оба утверждения строго эквивалентны.