Ответы:
Это выдержка из страницы руководства Bash:
export [-fn] [name [= word]] ...
export -p
Предоставленные имена помечаются для автоматического экспорта в среду последующих выполненных команд. Если задана опция -f, имена относятся к функциям ...
Если вам нужна переменная только в текущей среде, использовать экспорт не обязательно.
var=value
Редактировать:
Без экспорта: только текущая среда. С экспортом: текущая среда и дочерние среды.
Вот демонстрация влияния экспорта на доступность переменной в дочерней среде и то, что изменения в дочерней среде не влияют на родительскую:
$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
После первого echo ( echo "parent..."
) вы видите «123» и «456», потому что оба var1
и var2
активны в текущей среде. Вы не видите значение для, var3
потому что оно еще не установлено.
После строки, которая начинается " var3=...
", вы не видите значение, var1
потому что оно не было экспортировано. Вы делаете видите значение , var2
поскольку она была экспортирована. Вы видите значение , var3
потому что он был установлен для ребенка среды только .
( bash -c
эквивалентно запуску сценария с содержимым аргумента для -c
опции. Сценарий или другой исполняемый файл или, в этом случае, аргумент для bash -c
становится дочерним элементом текущей среды, который, в результате, конечно, является дочерним родитель) .
В «скрипте» значения переменной изменены. Теперь он выводит эти новые значения.
Как только «скрипт» завершен, выполнение возвращается в родительскую среду (в данном случае это командная строка). После последнего эха вы видите исходные значения, потому что изменения, сделанные в дочерней среде, не влияют на родительскую.
export
- сделать переменные доступными для этих дочерних сред.
Вы говорите, что
Я всегда использую команду экспорта, чтобы установить переменную среды
По тому, как вы это сформулировали, звучит так, будто вы действительно пытаетесь спросить, как сохранить переменную среды. Для этого вам потребуется поместить свое export VAR="foo"
заявление в ваш файл $ HOME / .bash_profile (если вы используете bash). Если вы хотите, чтобы эта переменная среды сохранялась для всех пользователей, кроме root, добавьте ее в / etc / profile. Если вы хотите добавить его и для пользователя root, установите его в /root/.bash_profile.
Это будет работать для всех оболочек входа в систему, где bash является предпочтительной оболочкой. Для не входящих в систему оболочек вам необходимо использовать .bashrc. У меня нет идей, чтобы предложить для других оболочек: D
экспорт - самый простой способ сделать это, так почему бы не оставить это в покое?
export VARIABLE=value # for Bourne, bash, and similar shells
setenv VARIABLE value # for csh and similar shells
FOO=BAR; executethisprogram
программа executethisprogram
НЕ БУДЕТ знать значение переменной FOO
. С другой стороны, при использовании: FOO=BAR; export FOO; executethisprogram
Программа executethisprogram
узнает значение переменной FOO
.
export FOO
это команда, которая помечает переменную FOO
так, чтобы к ней могли обращаться дочерние процессы среды, в которой была выполнена команда. Этот родитель может быть скриптом или интерактивной оболочкой.
Вы также можете сделать что-то вроде этого:
VAR=val application
Например:
LANG=C ls --help
вывод на английском.
LANG=pl_PL ls --help
вывод на польском языке (если есть).
В прошлом в sh вы не могли сделать экспорт VAL = val. Ты должен
VAL=val; export VAL
ls
например), не влияя на значение этой переменной в текущей (родительской) среде.
ls
является потомком процесса, из которого он был запущен. Если я печатаю ls
в командной строке, интерактивная оболочка является родительской и ls
дочерней. Если у меня есть сценарий, который использует, ls
то сценарий является родительским и ls
дочерним.