Що робить команда 'export'?


85

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

Я почав працювати з Дженкінсом нещодавно, і тоді мені довелося використовувати цю exportкоманду для запуску військового архіву Дженкінса . Тому мені потрібно було знати, що exportкоманда взагалі робить, і чому нам потрібно запускати цю команду під час запуску Дженкінса (після встановлення дому Дженкінса).

Дякую!


1
Було б корисно, якщо б ви сказали більше про команду експорту, яку використовували. Без додаткового контексту, я вважаю, що ви встановлювали змінну середовища. Див. En.wikipedia.org/wiki/Environment_variable#Unix
Джошуа Д. Бойд


можливий дублікат команди експорту unix
Джон Кугельман

Відповіді:


99

exportв shоболонках та пов'язаних з ними оболонках (таких як bash), позначає змінну середовища для експорту до дочірніх процесів, щоб дочірня дитина їх успадкувала.

exportвизначається в POSIX :

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


Дуже дякую! Усі ваші відповіді були справді корисними, і вони також допоможуть дізнатися ще кілька речей! :-)
Чатура Куласінге

1
Що таке дитячий процес у цьому сенсі?
Zinan Xing

13
Не розумію
Мартін Хансен

@MartinHansen, що ти не розумієш? також, див. мою відповідь.
Барлоп

У кінці посилання є зайва квадратна дужка, я не можу її редагувати, тому що це односимвольне редагування :)
Радослав Стоянов

27

Думаю, ви виходите з фону Windows. Тож я буду їх протиставляти (я теж новачок у Linux). Відповідь користувача на мій коментар виявилася корисною для з’ясування ситуації.

У Windows змінна може бути постійною чи ні. Термін змінна середовища включає змінну, встановлену в оболонці cmd за допомогою команди SET, а також коли змінну встановлено в графічному інтерфейсі Windows, таким чином встановленому в реєстрі, і стає видимою в нових вікнах cmd. наприклад, документація для команди set у вікні https://technet.microsoft.com/en-us/library/bb490998.aspx "Відображає, встановлює або видаляє змінні середовища. Використовуючи без параметрів, набір відображає поточні налаштування середовища." У Linux набір не відображає змінні середовища, він відображає змінні оболонки, які він не викликає / називає змінними середовища. Крім того, Linux не використовує set для встановлення змінних (крім позиційних параметрів і параметрів оболонки, які я пояснюю як примітку в кінці), лише для їх відображення і навіть тоді лише для відображення змінних оболонки. Windows використовує набір для налаштування та відображення, наприклад, встановити a = 5, Linux - ні.

У Linux, я думаю , ви могли б зробити скрипт , який встановлює змінні на завантажувальному, наприклад , /etc/profileабо , /etc/.bashrcале в іншому випадку, вони не є постійними. Вони зберігаються в оперативній пам'яті.

У Linux існує різниця між змінними оболонки та змінними середовища. У Linux змінні оболонки знаходяться лише в поточній оболонці, а змінні середовища - у цій оболонці та всіх дочірніх оболонках.

Ви можете переглядати змінні оболонки за допомогою setкоманди (хоча зауважте, що на відміну від windows, змінні не встановлюються в Linux за допомогою команди set).

set -o posix; set (виконавши перший раз set -o posix, допомагає не відображати занадто багато зайвих речей). Так setвідображаються змінні оболонки.

Ви можете переглядати змінні середовища за допомогою envкоманди

змінні оболонки встановлюються, наприклад, просто a = 5

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

Тут ви бачите змінну оболонку zzz із zzz = 5, і ви бачите, як вона відображається під час запуску, setале не відображається як змінна середовища.

Тут ми бачимо набір yyy з експортом, тому це змінна середовища. І дивіться, це показано як під змінними оболонки, так і під змінними середовища

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

інші корисні теми

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/environment-variable-vs-shell-variable-whats-the-difference

Примітка. Одним моментом, який трохи розробляє і дещо коригує те, що я писав, є те, що в linux bash 'set' може використовуватися для встановлення "позиційних параметрів" та "параметрів / атрибутів оболонки", і технічно обидва це змінні, хоча на сторінках довідок їх не можна описати як такі. Але все-таки, як уже згадувалося, набір не встановлює змінні оболонки або змінні середовища). Якщо ви це зробите, set asdfтоді він встановлює $ 1 як asdf, а якщо echo $1ви бачите asdf. Якщо ти зробишset a=5він не встановить змінну a, рівну 5. Він встановить позиційний параметр $ 1 рівний рядку "a = 5". Отже, якщо ви коли-небудь бачили набір a = 5 в linux, це, мабуть, помилка, якщо хтось насправді не хотів, щоб рядок a = 5, в $ 1. Інше, що може встановити набір Linux, це параметри / атрибути оболонки. Якщо ви встановите -o, ви побачите їх список. І ви можете зробити, наприклад set -o verbose, вимкнути, щоб увімкнути багатослів'я (до речі, за замовчуванням вимкнено, але це не має ніякої різниці). Або ви можете зробити, set +o verboseщоб вимкнути багатослів’я. Windows не використовує таке використання для своєї команди set.


схоже, що набір показує оболонку та середовище, а 'env' - лише оточення
barlop

1
Ця відповідь дуже подобається, оскільки вона охоплює випадки nix vs win, які спочатку можуть заплутати.
Нічого

6

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


1
Але якщо я кажу, a=5тоді echo $aце говорить 5. І все-таки ви писали "у будь-який час, якщо ви зміните будь-яке зі значень змінних, оболонка не зможе вибрати цю зміну. ​​Це означає, що внесені вами зміни стають ефективними в нових сеансах оболонки". . <- То як він оновив сеанс оболонки без експорту. Чи можете ви навести приклад, коли необхідний експорт?
barlop

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