Різниця між змінними оболонками, які експортуються, та тими, які не знаходяться в bash


41

Здається, Bash відрізняє між змінними, які були експортовані, і тими, які ні.

приклад:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

setбачить змінну, але envне робить.

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

setбачить обидві змінні, але envбачить лише експортовану змінну.

Я знаю, що setце вбудований удар, і envце не так.

Які відмінності між змінними, які експортуються, та тими, які немає?


17
Термінологічна примітка: "змінна середовище" завжди експортується. Неекспортна змінна - це "змінна оболонка" (або "параметр").
Жил "ТАК - перестань бути злим"

Відповіді:


44

Експортовані змінні переносяться в оточення команд, виконаних оболонкою, яка експортувала їх, тоді як неекспортовані змінні є локальними для поточного виклику оболонки. На exportчоловіковій сторінці:

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

setвиводить поточне середовище, що включає будь-які локальні неекспортовані змінні. envвикористовується для запуску програм у новому середовищі, і без жодних аргументів виводиться те, яким було б це нове середовище. Оскільки envстворюється нове середовище, через експортуються лише змінні, що експортуються, як це стосується будь-якої програми, запущеної з цієї оболонки. Наприклад, нерест другої оболонки в першій (я $$представляв підказки у внутрішній оболонці):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

Зауважте, що експортується змінна, а не лише її значення. Це означає , що як тільки ви export FOO, FOOстає глобальною змінною і відображається в наступних умовах, навіть якщо змінити пізніше:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$

тож якщо вас турбує лише поточна оболонка, вам потрібно експортувати? Окремо чому б localeдля поточної оболонки не відображалися оновлення?
Pacerier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.