Kiedy zmienimy jakąś zmienną w ~/.profile
Ubuntu, wówczas wykonujemy polecenie source .profile
. Wtedy zmiana obowiązuje tylko w tym terminalu. Jeśli otworzymy nowy terminal, musimy source .profile
ponownie wykonać polecenie . Wygląda więc na to, że różne terminale mają swoje własne środowisko, chociaż mogą należeć do tego samego użytkownika.
Jakie są zalety tego, że każdy terminal ma swoją własną ścieżkę środowiska? Wydaje się, że byłoby lepiej, gdyby inny terminal należący do tego samego użytkownika współdzielił tę samą zmienną środowiskową.
environment-variables
.profile
cainiaofei
źródło
źródło
Odpowiedzi:
Powodem tego jest to, że
~/.profile
są pozyskiwane tylko z powłok logowania. Po otwarciu nowego okna terminala uruchamiana jest domyślnie powłoka niezalogowana. Jeśli się wylogujesz i zalogujesz ponownie, zmiana na~/.profile
będzie obowiązywać we wszystkich twoich terminalach, ponieważ~/.profile
jest pozyskiwana podczas logowania do sesji.Nie jest tak, że różne okna terminali mają inne środowisko, ale pozyskiwanie odbywa się
~/.profile
tylko~/.profile
w bieżącej powłoce (dokładnie tosource
robi polecenie).Natomiast zmiana na
~/.bashrc
natychmiast wpłynie na każde nowe okno terminala, które otworzysz, lub dowolną powłokę Bash, którą zaczniesz pisaćbash
, ponieważ jest pozyskiwana przez wszystkie interaktywne powłoki Bash.źródło
Zmienne środowiskowe służą nie tylko preferencjom użytkownika. Są to ogólny mechanizm przekazywania różnorodnych informacji o ustawieniach od procesu nadrzędnego do procesów potomnych, które uruchamia.
Istnieje wiele przypadków, w których proces ustawia określone zmienne środowiskowe, aby wpływać tylko na procesy, które uruchamia. Na przykład skrypt może celowo zresetować ustawienia regionalne dla poleceń, które uruchamia, tak aby mógł przeanalizować dane wyjściowe z nich. Skrypty kompilacji dla wielu dużych pakietów oprogramowania używają zagnieżdżonych wywołań
make
tej współrzędnej za pomocą zmiennych środowiskowych. Specjalistyczne narzędzia mogą potrzebować zmiany warunków pracy innych programów, które uruchamiają, wykonując sztuczki za pomocą $ LD_PRELOAD lub $ PATH.Jeśli coś użytkownik zrobi w innym oknie, podczas gdy długa kompilacja jest uruchomiona w innym, po prostu magicznie zmieni zmienne środowiskowe wszystkich swoich procesów za ich plecami, spowoduje szaleństwo i chaos.
Inne zmienne środowiskowe zawierają informacje o konkretnej sesji, w której uruchamiany jest proces. Programy oczekują od $ TERM opisu zestawu poleceń określonego terminala (lub emulatora terminala), z którym są połączone; sprawiając, że ogólne ustawienie dla poszczególnych użytkowników uniemożliwiłoby zalogowanie się do tego samego systemu z kilkoma różnymi rodzajami terminali. Nawet jeśli masz tylko jeden element terminala i nigdy nie logujesz się zdalnie, programy takie jak np.
screen
Ustawiają inny $ TERM dla procesów uruchamianych w ich sesji.Lepszym pytaniem byłoby, dlaczego używamy mechanizmu komunikacji międzyprocesowej dla ustawień preferencji użytkownika, a nie bazy danych dla poszczególnych użytkowników?
Odpowiedź: Ponieważ to działa wystarczająco dobrze i korzyści z dokonywania bazy danych dla każdego użytkownika nie są na tyle duże, że praca zmienia wszystko w użyciu że zamiast zmiennych środowiskowych byłoby zrobić.
(Mogę wymyślić bardzo niewiele ustawień preferencji, w których nie byłoby przypadków użycia, w których wygodnie byłoby je zmienić tylko na przykład w celu wykonania pojedynczego skryptu. Aby nie utracić funkcjonalności, wszystko musiałoby zostać zastąpione przez zmienne środowiskowe, co powoduje dodatkową złożoność i bardziej zdezorientowanych użytkowników).
To nie tak, że alternatywy nie istnieją . Na przykład zasoby X są na sesję wyświetlania, a nie na proces. Są one jednak trudno dostępne dla programów wiersza polecenia - a programy wiersza polecenia zwykle muszą działać dla zdalnych loginów, które nie mają nawet serwera X, z którym można się połączyć.
źródło