Яке використання команди "експортувати"?


12

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

$TEST=hello

Після цього я експортував його і спробував знову echoв іншому вікні терміналу. результат був таким же, як і раніше.

export TEST 

але якщо я виконую той самий код при вході (додаючи код до ~/.profileфайлу), змінні можуть використовуватися будь-яке вікно терміналу. Що тут відбувається? Чим відрізняється виконання коду в терміналі та його виконання при вході?

Відповіді:


26

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

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


1

Кожен процес має кілька атрибутів, які процес може встановлювати індивідуально та незалежно від інших процесів. Прикладами є обмеження ресурсів, umask, поточний каталог, змінні середовища та деякі інші. Після створення процесу (за допомогою fork()системного виклику) дитина успадковує ці атрибути від батьків. Після цього дочірній процес може задавати ці атрибути довільно. (Існують деякі обмеження. Процес може не збільшувати обмеження жорстких ресурсів або змінювати його поточний каталог на каталог, на який він не має дозволу exec.)

Лише деякі програми змінюють змінні середовища, більшість не турбує. Припустимо, останній випадок. Отже, якщо дитячий процес створює собі подальших дітей, то ці процеси матимуть ті самі змінні середовища, що й діди. І так далі.

Тепер оболонка має безліч змінних, з якими можна переглядати set(в оболонках типу Борна Шелл, не знаю про С Шел). Ці змінні не є змінними середовища, якщо вони не exportредагуються. Змінні середовища можна переглядати env. Якщо запустити програму з командного рядка оболонки, вона успадкує змінні середовища від оболонки. Так само і для програми, запущеної із сценарію оболонки.

Тому при вході в систему є оболонка, яка зчитує дані профілю (наприклад ~/.profile) і успадковує їх практично всім дітям, онукам тощо. Це те, як налаштування змінної середовища стикаються з оболонки входу або скрипту входу до всіх інших програм, запущених в рамках сеансу входу.

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

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

$TEST=hello

Це навряд чи вдасться, якщо вимкнено змінне розширення або $TESTвже не має відповідного значення. Якщо ви хочете призначити helloзмінну, TESTви повинні сказати TEST=hello(зверніть увагу: ні $).

Після цього я експортував його і спробував знову echoв іншому вікні терміналу. результат був таким же, як і раніше.

Ще раз, це очікуваний результат.

але якщо я виконую той самий код при вході (додаючи код до ~/.profileфайлу), змінні можуть використовуватися будь-яке вікно терміналу.

Це відбувається тому, що оболонка в терміналі є нащадком оболонки, яка читає налаштування середовища з ~/.profileі, таким чином, успадковує ці налаштування.

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