Установка переменных среды Linux

9

Я использую Red Hat Linux Enterprise 5; Я всегда использую команду экспорта для установки переменных среды.

Существуют ли другие способы установки переменных среды и каковы их преимущества / недостатки?

George2
источник

Ответы:

16

Это выдержка из страницы руководства 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становится дочерним элементом текущей среды, который, в результате, конечно, является дочерним родитель) .

В «скрипте» значения переменной изменены. Теперь он выводит эти новые значения.

Как только «скрипт» завершен, выполнение возвращается в родительскую среду (в данном случае это командная строка). После последнего эха вы видите исходные значения, потому что изменения, сделанные в дочерней среде, не влияют на родительскую.

Приостановлено до дальнейшего уведомления.
источник
Что значит "в нынешних условиях"? Текущий скрипт bash или?
George2
1
Да, это означает «в текущем скрипте» или «в текущем интерактивном сеансе». Таким образом, это исключает исполняемые файлы или сценарии, которые запускаются из текущего сценария или интерактивного сеанса. Это цель export- сделать переменные доступными для этих дочерних сред.
Приостановлено до дальнейшего уведомления.
Я нахожу некоторые конфликты из того, что вы сказали. :-) Вы сказали «чтобы исключить исполняемые файлы или сценарии», обратите внимание на «исключить», но в том, что вы цитировали, вы упомянули «предоставленные имена помечены для автоматического экспорта в среду впоследствии выполненных команд». - это должно быть «включать» (автоматически экспортировать или влиять), а не «исключать». Я запутался, не могли бы вы уточнить, пожалуйста?
George2
1
@ George2: Смотрите мой отредактированный ответ для получения дополнительной информации.
Приостановлено до дальнейшего уведомления.
3

Вы говорите, что

Я всегда использую команду экспорта, чтобы установить переменную среды

По тому, как вы это сформулировали, звучит так, будто вы действительно пытаетесь спросить, как сохранить переменную среды. Для этого вам потребуется поместить свое export VAR="foo"заявление в ваш файл $ HOME / .bash_profile (если вы используете bash). Если вы хотите, чтобы эта переменная среды сохранялась для всех пользователей, кроме root, добавьте ее в / etc / profile. Если вы хотите добавить его и для пользователя root, установите его в /root/.bash_profile.

Это будет работать для всех оболочек входа в систему, где bash является предпочтительной оболочкой. Для не входящих в систему оболочек вам необходимо использовать .bashrc. У меня нет идей, чтобы предложить для других оболочек: D

Уэйли
источник
2
Возможно, вы захотите перечитать раздел справочной страницы Bash относительно того, когда эти файлы получены.
Приостановлено до дальнейшего уведомления.
1
Да ... Я получил логин и интерактив запутался. Редактирование моего ответа для отражения. Спасибо за исправление!
кит
«сделать переменную среды сохраняющейся» - что значит сохраняться?
George2
1
«Persist» означает, что вы хотите, чтобы эта переменная имела это значение при каждом запуске оболочки. Может потребоваться или не быть необходимым экспортировать переменную в зависимости от ее назначения.
Приостановлено до дальнейшего уведомления.
1
Это означает, что вы не сделали это постоянным. Попробуйте сделать то, что описал китобой .
Приостановлено до дальнейшего уведомления.
1

экспорт - самый простой способ сделать это, так почему бы не оставить это в покое?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells
BloodPhilia
источник
2
Bourne shell требует VARIABLE = значение; экспорт VARIABLE
mpez0
1
Это тоже должно сработать ...
BloodPhilia
@BloodPhilia, для bash, только один способ установить переменную окружения?
George2
1
@ George2 - при использовании VARIABLE = значение вы создаете локальную переменную, которая исчезает после выполнения текущего скрипта. При использовании экспорта дочерние процессы наследуют значения переменных от своего родительского процесса. Например: FOO=BAR; executethisprogram программа executethisprogramНЕ БУДЕТ знать значение переменной FOO. С другой стороны, при использовании: FOO=BAR; export FOO; executethisprogram Программа executethisprogramузнает значение переменной FOO.
BloodPhilia
1
executethisprogram не является подпроцессом "export FOO". Это подпроцесс (дочерний элемент) скрипта, который его вызывает, или интерактивная оболочка (командной строки). export FOOэто команда, которая помечает переменную FOOтак, чтобы к ней могли обращаться дочерние процессы среды, в которой была выполнена команда. Этот родитель может быть скриптом или интерактивной оболочкой.
Приостановлено до дальнейшего уведомления.
1

Вы также можете сделать что-то вроде этого:

VAR=val application

Например:

LANG=C ls --help

вывод на английском.

LANG=pl_PL ls --help

вывод на польском языке (если есть).

В прошлом в sh вы не могли сделать экспорт VAL = val. Ты должен

VAL=val; export VAL
gogiel
источник
Я запутался насчет "VAR = val application", что значит val и что означает application?
George2
2
Эти примеры устанавливают значение переменной для дочерней среды ( lsнапример), не влияя на значение этой переменной в текущей (родительской) среде.
Приостановлено до дальнейшего уведомления.
Это детская среда чего? Я запутался.
George2
1
lsявляется потомком процесса, из которого он был запущен. Если я печатаю lsв командной строке, интерактивная оболочка является родительской и lsдочерней. Если у меня есть сценарий, который использует, lsто сценарий является родительским и lsдочерним.
Приостановлено до дальнейшего уведомления.