Do czego służy polecenie „eksportuj”?

12

Utworzyłem zmienną środowiskową w jednym oknie terminala i próbowałem echo w innym oknie terminala. To nic nie pokazało.

$TEST=hello

Następnie wyeksportowałem go i spróbowałem ponownie echow innym oknie terminala. wynik był taki sam jak poprzednio.

export TEST 

ale jeśli wykonam ten sam kod przy logowaniu (dołączając kod do ~/.profilepliku), zmiennych można użyć w dowolnym oknie terminala. Co tu się dzieje? Czym różni się wykonywanie kodu w terminalu od wykonywania tego samego przy logowaniu?

DScript
źródło

Odpowiedzi:

26

exportczyni zmienną coś, co zostanie uwzględnione w potomnych środowiskach procesowych. Nie wpływa na inne już istniejące środowiska. Zasadniczo nie ma sposobu, aby ustawić zmienną w jednym terminalu i pozwolić jej automatycznie pojawiać się w innym terminalu, środowisko jest tworzone dla każdego procesu osobno.

Dodanie go do twojego .profilepowoduje, że twoje środowisko będzie skonfigurowane do włączenia tej nowej zmiennej przy każdym logowaniu. Więc nie jest eksportowany z jednej powłoki do drugiej, ale zamiast tego instruuje nową powłokę, aby ją uwzględniła podczas konfigurowania początkowego środowiska.

Eric Renouf
źródło
1

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ą exportedytowane. 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 $TESTma już odpowiednią wartość. Jeśli chcesz przypisać hellodo zmiennej TEST, musisz powiedzieć TEST=hello(uwaga: nie $).

Następnie wyeksportowałem go i spróbowałem ponownie echow 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 ~/.profilepliku), 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 ~/.profilei dziedziczy te ustawienia.

przeciwdziałanie
źródło