Глобальні змінні середовища у сценарії оболонки


83

Як встановити глобальну змінну середовища в скрипті bash?

Якщо я роблю подібні речі

#!/bin/bash
FOO=bar

... або

#!/bin/bash
export FOO=bar

... vars, здається, залишаються в локальному контексті, тоді як я хотів би продовжувати використовувати їх після завершення виконання сценарію.

Відповіді:


141

Запустіть скрипт за допомогою .

. myscript.sh

Це запустить сценарій у поточному середовищі оболонки.

export визначає, які змінні будуть доступні для нових процесів, так що якщо ви скажете

FOO=1
export BAR=2
./runScript.sh

тоді $BARбуде доступний в середовищі runScript.sh, але $FOOне буде.


27
Будьте обережні з цим першим. Без скісної риски це буде виглядати на вашому шляху: використовуйте щось на зразок '. ./myscript.sh ', якщо ви хочете переконатися, що він працює певний.
paxdiablo

13
sourceє псевдонімом для .. Тож ви можете source myscript.shзамість цього запустити , якщо хочете бути більш чітким.
Ехтеш Чоудхурі

Мені цікаво, що відбувається, коли я запускаю сценарій з крапкою та пробілом. приклад. myscript
cNgamba

54

Коли ви запускаєте сценарій оболонки, це робиться у допоміжній оболонці, тому він не може впливати на оточення батьківської оболонки. Ви хочете отримати джерело сценарію, виконавши:

. ./setfoo.sh

Це виконує його в контексті поточної оболонки, а не як допоміжний файл оболонку.

Зі сторінки керівництва bash:

. ім'я файлу [аргументи]
джерело ім'я файлу [аргументи]

Читання та виконання команд з імені файлу в поточному середовищі оболонки та повернення статусу виходу останньої команди, виконаної з імені файлу.

Якщо ім'я файлу не містить скісної риски, імена файлів у PATH використовуються для пошуку каталогу, що містить ім'я файлу.

Файл, який шукають у PATH, не обов'язково повинен бути виконуваним. Коли bash не в режимі POSIX, здійснюється пошук поточного каталогу, якщо в PATH не знайдено жодного файлу.

Якщо опцію sourcepath для вбудованої команди shopt вимкнено, PATH не буде здійснено пошук.

Якщо надаються будь-які аргументи, вони стають позиційними параметрами при виконанні імені файлу.

В іншому випадку позиційні параметри не змінюються. Статус повернення - це стан останньої команди, яка вийшла в сценарії (0, якщо жодна команда не виконується), і значення false, якщо ім'я файлу не знайдено або його неможливо прочитати.


Цікаво - цього синтаксису я раніше не бачив. Це еквівалентно джерелу ./setfoo.sh?
ire_and_curses

2
Це те саме, лише швидше набирати текст (і більш сумісний у старих системах - ksh не має вихідної команди, але має '.').
paxdiablo

9

source myscript.sh також можливо.

Опис команди linux source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

Можливо, тут трохи детальніше. Як щодо дуже короткого опису того, що sourceробить?
Phillip Cloud

Введіть @PhillipCloud man sourceу термінал, і ви отримаєте те, що хочете.
CDT

5
Я знайомий з source. Можливо, ОП це не так.
Phillip Cloud

2
@PhillipCloud Я хотів би трохи деталей, сам. Якщо ви хочете відредагувати відповідь, ви точно можете це зробити. Допоможіть справі і все таке ... Thx!
Dan Rosenstark

4
#!/bin/bash
export FOO=bar

або

#!/bin/bash
FOO=bar
export FOO

експорт людини:

Оболонка повинна надавати атрибут експорту змінним, що відповідають зазначеним іменам, що призведе до того, що вони будуть знаходитись у середовищі наступних команд. Якщо за назвою змінної додається = word, тоді значення цієї змінної має бути встановлено як word.


Будь ласка, кожному новачкові в сценаріях оболонки: зауважте, що між ім’ям envvar, символом '=' та самим значенням немає порожнього місця; це не могло б спрацювати:export FOO = /mydir/bar
russellhoff

-3
FOO=bar
export FOO

2
Це не працює, не встановлює змінну середовища для батьківського процесу.
dreamlax

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