Każdy proces ma kilka atrybutów, które można ustawić indywidualnie i niezależnie od innych procesów. Przykładami są limity zasobów, umask, bieżący katalog, zmienne środowiskowe i inne. Po utworzeniu procesu (za pomocą fork()
wywołania systemowego) dziecko dziedziczy te atrybuty od rodzica. Następnie proces potomny może dowolnie ustawić te atrybuty. (Obowiązują pewne ograniczenia, proces nie może zwiększyć limitów zasobów twardych ani zmienić bieżącego katalogu na katalog, dla którego nie ma uprawnień do wykonania).
Tylko kilka programów modyfikuje swoje zmienne środowiskowe, większość nie zawraca sobie głowy. Załóżmy ten drugi przypadek. Jeśli więc proces potomny utworzy kolejne potomki, wówczas procesy te będą miały te same zmienne środowiskowe, co dziadek. I tak dalej.
Teraz powłoka ma wiele zmiennych, które można przeglądać set
(w powłokach typu Bourne Shell, nie wiem o C Shell). Te zmienne nie są zmiennymi środowiskowymi, chyba że są export
edytowane. Zmienne środowiskowe można przeglądać za pomocą env
. Jeśli uruchomisz program z wiersza poleceń powłoki, program odziedziczy zmienne środowiskowe z powłoki. Podobnie jest w przypadku programu uruchamianego ze skryptu powłoki.
Dlatego po zalogowaniu jest powłoka, która odczytuje dane profilu (np. ~/.profile
) I dziedziczy je praktycznie dla wszystkich dzieci, wnuków i tak dalej. W ten sposób ustawienia zmiennych środowiskowych spływają z powłoki logowania lub skryptu logowania do wszystkich innych programów uruchomionych w sesji logowania.
Utworzyłem zmienną środowiskową w jednym oknie terminala i próbowałem echo w innym oknie terminala. To nic nie pokazało.
Zgodnie z powyższym wyjaśnieniem jest to oczekiwany wynik. Zmiany w otoczeniu procesu dotyczą tylko potomków tego procesu, które są tworzone odtąd, a nie istniejących.
$TEST=hello
To i tak raczej nie zadziała, chyba że rozszerzenie zmiennej jest wyłączone lub $TEST
ma już odpowiednią wartość. Jeśli chcesz przypisać hello
do zmiennej TEST
, musisz powiedzieć TEST=hello
(uwaga: nie $
).
Następnie wyeksportowałem go i spróbowałem ponownie echo
w innym oknie terminala. wynik był taki sam jak poprzednio.
Po raz kolejny jest to oczekiwany wynik.
ale jeśli wykonam ten sam kod przy logowaniu (dołączając kod do ~/.profile
pliku), zmiennych można użyć w dowolnym oknie terminala.
Wynika to z faktu, że powłoka w terminalu jest potomkiem powłoki, która odczytuje ustawienia środowiska ~/.profile
i dziedziczy te ustawienia.