Кожен процес має кілька атрибутів, які процес може встановлювати індивідуально та незалежно від інших процесів. Прикладами є обмеження ресурсів, umask, поточний каталог, змінні середовища та деякі інші. Після створення процесу (за допомогою fork()
системного виклику) дитина успадковує ці атрибути від батьків. Після цього дочірній процес може задавати ці атрибути довільно. (Існують деякі обмеження. Процес може не збільшувати обмеження жорстких ресурсів або змінювати його поточний каталог на каталог, на який він не має дозволу exec.)
Лише деякі програми змінюють змінні середовища, більшість не турбує. Припустимо, останній випадок. Отже, якщо дитячий процес створює собі подальших дітей, то ці процеси матимуть ті самі змінні середовища, що й діди. І так далі.
Тепер оболонка має безліч змінних, з якими можна переглядати set
(в оболонках типу Борна Шелл, не знаю про С Шел). Ці змінні не є змінними середовища, якщо вони не export
редагуються. Змінні середовища можна переглядати env
. Якщо запустити програму з командного рядка оболонки, вона успадкує змінні середовища від оболонки. Так само і для програми, запущеної із сценарію оболонки.
Тому при вході в систему є оболонка, яка зчитує дані профілю (наприклад ~/.profile
) і успадковує їх практично всім дітям, онукам тощо. Це те, як налаштування змінної середовища стикаються з оболонки входу або скрипту входу до всіх інших програм, запущених в рамках сеансу входу.
Я створив змінну середовища в одному вікні терміналу і намагався повторити його в іншому термінальному вікні. Це нічого не відображало.
За вищенаведеним поясненням, це очікуваний результат. Зміни в середовищі процесу зачіпають лише дітей цього процесу, які створюються відтепер, а не існуючими.
$TEST=hello
Це навряд чи вдасться, якщо вимкнено змінне розширення або $TEST
вже не має відповідного значення. Якщо ви хочете призначити hello
змінну, TEST
ви повинні сказати TEST=hello
(зверніть увагу: ні $
).
Після цього я експортував його і спробував знову echo
в іншому вікні терміналу. результат був таким же, як і раніше.
Ще раз, це очікуваний результат.
але якщо я виконую той самий код при вході (додаючи код до ~/.profile
файлу), змінні можуть використовуватися будь-яке вікно терміналу.
Це відбувається тому, що оболонка в терміналі є нащадком оболонки, яка читає налаштування середовища з ~/.profile
і, таким чином, успадковує ці налаштування.