Встановлення змінних середовища Linux


9

Я працюю Red Hat Linux Enterprise 5; Я завжди використовую команду експорту для встановлення змінних середовища.

Чи існують інші способи встановлення змінних середовища та які переваги / недоліки у них?

Відповіді:


16

Це уривок зі сторінки чоловіка Баша:

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 "parent...") ви бачите «123» і «456» , тому що , як var1і var2активні в поточній середовищі. Ви не бачите значення, var3оскільки воно ще не встановлено.

Після рядка, який починається, " var3=..." ви не бачите значення, var1оскільки воно не було експортовано. Ви робите бачите значення , var2оскільки вона була експортована. Ви бачите значення , var3тому що він був встановлений для дитини середовища тільки .

( bash -cеквівалентно запуску скрипта зі змістом аргументу до -cпараметра. Сценарій або інший виконуваний файл або, в цьому випадку, аргумент, щоб bash -cстати дочіркою поточного середовища, в результаті чого, звичайно, є дитина батьків.)

У "скрипті" значення змінної змінюються. Тепер він виводить ці нові значення.

Після закінчення "скрипту" виконання повертається до батьківського середовища (командний рядок у цьому випадку). Після останнього відлуння ви бачите початкові значення, оскільки зміни, внесені в дочірнє середовище, не впливають на батьків.


Що означає «в поточному середовищі»? Поточний сценарій bash або?
Джордж2

1
Так, це означає "в поточному сценарії" або "в поточному інтерактивному сеансі". Таким чином, це виключає виконувані файли або сценарії, які запускаються з поточного сценарію або інтерактивного сеансу. Це і є мета export- зробити змінні доступними для цих дочірніх середовищ.
Призупинено до подальшого повідомлення.

Я знаходжу деякі конфлікти з того, що ви сказали. :-) Ви сказали "Отже, що виключає виконувані файли або сценарії", зверніть увагу на "виключити", але в тому, що ви цитували, ви згадали "Поставлені імена позначені для автоматичного експорту в середовище згодом виконаних команд." - воно повинно бути "включено" (автоматично експортується або впливати), а не "виключати". Я розгублений, чи можете ви уточнити, будь ласка?
Джордж2

1
@ George2: Дивіться мою відредаговану відповідь для отримання додаткової інформації.
Призупинено до подальшого повідомлення.

3

Ти це кажеш

Я завжди використовую команду експорту для встановлення змінної середовища

До того, як ви це зробили, це здається, що ви насправді намагаєтеся запитати, як зробити, щоб екологічна змінна зберігалася. Для цього потрібно буде розмістити export VAR="foo"заяву у вашому файлі $ HOME / .bash_profile (якщо ви використовуєте bash). Якщо ви хочете, щоб змінна середовище зберігалася для всіх користувачів, окрім root, додайте її до / etc / profile. Якщо ви хочете, щоб його додали і для кореневого користувача, встановіть його в /root/.bash_profile.

Це буде працювати для всіх оболонок входу, де bash - це оболонка вибору. Для оболонок без входу потрібно використовувати .bashrc. Я не маю жодної ідеї для інших снарядів: D


2
Ви можете перечитати розділ сторінки Bash man щодо того, коли ці файли розміщені.
Призупинено до подальшого повідомлення.

1
Так ... у мене заплутався вхід та інтерактив. Редагування моєї відповіді для роздумів. Дякуємо за виправлення!
кит

"зробити екологічну змінну зберігається" - що означає зберігається?
Джордж2

1
"Персист" означає, що ви хочете, щоб ця змінна мала це значення кожного разу при запуску оболонки. Експорт змінної може бути, а може і не потрібно, залежно від того, яка її мета.
Призупинено до подальшого повідомлення.

1
Це означає, що ви не зробили це стійким. Спробуйте зробити те, що описав Уолі .
Призупинено до подальшого повідомлення.

1

експорт - це найпростіший спосіб зробити це, то чому б не залишити його при цьому?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells

2
Оболонка Борна вимагає VARIABLE = значення; експорт VARIABLE
mpez0

1
Це теж має працювати ...
Переповнення стека мертве

@BloodPhilia, для bash, лише один спосіб встановити змінну середовища?
Джордж2

1
@ George2 - використовуючи VARIABLE = значення, ви створюєте локальну змінну, яка відсутня після виконання поточного сценарію. Під час використання експорту дочірні процеси успадковують змінні значення від батьківського процесу. Наприклад: FOO=BAR; executethisprogram Програма executethisprogramНЕ буде знати значення змінної FOO. З іншого боку, при використанні: FOO=BAR; export FOO; executethisprogram Програма executethisprogramдізнається значення змінної FOO.
Переповнення стека мертве

1
Executethisprogram не є підпроцесом "експорту FOO". Це підпроцес (дочірній) скрипту, який викликає його, або інтерактивна оболонка (командного рядка). export FOOце команда, що позначає змінну, FOOщоб вона могла отримати доступ до дочірніх процесів оточення, в якій команда була видана. Цей батько може бути сценарієм або інтерактивною оболонкою.
Призупинено до подальшого повідомлення.

1

Ви також можете зробити щось подібне:

VAR=val application

Наприклад:

LANG=C ls --help

вихід англійською мовою.

LANG=pl_PL ls --help

вихід польською мовою (за наявності).

Раніше в sh ви не могли здійснити експорт VAL = val. Вам довелося

VAL=val; export VAL

Мене бентежить "VAR = val application", що означає val і що означає додаток?
Джордж2

2
Ці приклади встановлюють значення змінної для дочірнього середовища ( lsнаприклад), не впливаючи на значення цієї змінної у поточному (батьківському) середовищі.
Призупинено до подальшого повідомлення.

Це дитяче оточення? Я збентежений.
Джордж2

1
lsє дитиною процесу, з якого він був запущений. Якщо я набираю lsв командному рядку, інтерактивна оболонка є батьківською і lsє дочірньою. Якщо у мене є сценарій, який використовує, lsто сценарій є батьківським і lsє дочірньою.
Призупинено до подальшого повідомлення.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.