Що робить експорт у BASH? [дублікат]


74

Можливий дублікат:
різниця між "a = b" і "експортом a = b" в bash

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

export foo=5

і коли я не повинен експортувати змінну?


Ось посилання на принаймні ще одне корисне питання на цю тему: superuser.com/questions/143413/linux-environment-variables ... оскільки за іронією долі це питання було першим, що спливе в Google для мого запиту щодо експорту в bash .
Псалом Огре3333


Одне поширене використання - додавати exportзаяви до .bashrc / .bash_profile для створення стійких глобальних змінних, подібних до $HOME.
Еван Плейс

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

Відповіді:


15

Від man bash:

СЕРЕДОВИЩЕ

Коли програма викликається, їй надається масив рядків, які називаються середовищем. Це список пар імен-значення, назва форми = значення.

Оболонка забезпечує кілька способів маніпулювання навколишнім середовищем. Після виклику оболонка сканує власне середовище та створює параметр для кожного знайденого імені, автоматично позначаючи його для експорту в дочірні процеси. Виконані команди успадковують оточення. Команди export і declare -x дозволяють додавати параметри та функції в середовище та видаляти їх. Якщо значення параметра в середовищі буде змінено, нове значення стає частиною середовища, замінюючи старе. Середовище, успадковане будь-якою виконаною командою, складається з початкового середовища оболонки, значення якого можуть бути змінені в оболонці, за вирахуванням будь-яких пар, видалених unset командою, плюс будь-яких доповнень за допомогою експорту та declare -xкоманд.


72
Копіювання IMHO копії витягу з документації без додаткових зусиль для пояснення не повинно бути апробованим.
Артур

29
Цей уривок не дуже зрозумілий, і чесно кажучи, я не розумів, що відбувається.
Трисмегістос

4
@Artur: навпаки: якщо (витяг із документації) відповідає на запитання, я краще не маю додаткових пояснень.
Рене Ніффенеггер

1
@ RenéNyffenegger, але, схоже, це не так. Принаймні, я цього не отримав, поки не прочитав відповідь BloodPhilia, яку слід позначити як прийняту.
Владислав Раструсний

1
Я вважаю, що Артур і Трисмегістос висловлювали те, що кожен може скопіювати пасту, її не завжди достатньо, уточнити та дати хорошу відповідь. Добре скопіювати вставити якусь документацію або надати посилання, насправді це рекомендується, але має бути якесь додаткове пояснення якості. Крім того, це пояснення може легко проігнорувати такі люди, як RenéNyffenegger, якщо вони цього не потребують, але вони знайдуться для тих, хто від цього виграє. Усі ми намагаємося навчитися і по-різному розуміємо, це допомагає охопити різноманітні стилі навчання та покращить ваш рейтинг.
Jasonleonhard

98

Експортовані змінні передаються дочірнім процесам, а неекспортовані змінні - ні.


Чи можете ви вказати на будь-яку документацію, яка стосується цього. Я шукаю більше інформації, ніж це. Наприклад, чи потрібно експортувати змінну лише один раз, чи потрібно її експортувати після кожної зміни тощо.
Chas. Оуенс

1
Ви можете перевірити це: superuser.com/questions/143413/linux-environment-variables/…
BloodPhilia

3
Ви можете перевірити це, додавши щось до контуру (скажіть PYTHONPATH), а потім зауваживши, що, хоча ви можете, echo $PYTHONPATHвін не розпізнається сценаріями python або bash, поки ви exportцього не зробите
Kaushik Ghose

Здається, ця відповідь також не зовсім правдива. Наприклад, Bash під оболонки призначені для дочірніх процесів (відповідно $BASHPID), але ви можете читати не експортовані змінні з батьківської оболонки. Просте доведення: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") Я здогадуюсь, що це особливий випадок, який виникає, коли дочірній процес є підрозділом.
JepZ

20

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

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

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