Chodzi o to, że użytkownik powinien mieć (najwyżej) jedną powłokę logowania na host. (Być może powinienem powiedzieć, że jedna powłoka logowania na hosta na terminal - jeśli jesteś jednocześnie zalogowany do hosta za pośrednictwem wielu terminali, można oczekiwać, że będziesz mieć wiele powłok logowania). Zazwyczaj (zawsze?) Będzie to pierwsza otrzymana powłoka po zalogowaniu (stąd nazwa). Tak więc ten schemat pozwala określić działania, które mają się zdarzyć tylko raz podczas logowania, oraz rzeczy, które mają się zdarzyć przy każdym uruchomieniu nowej (interaktywnej) powłoki.
Zwykle każda inna powłoka uruchamiana po zalogowaniu będzie potomkiem powłoki potomnej (dziecko dziecka…) i dlatego odziedziczy wiele ustawień (zmiennych środowiskowych umask
itp.) Z powłoki logowania. A zatem chodzi o to, że pliki inicjalizacji login ( .login
, .profile
etc.) należy skonfigurować ustawienia, które są dziedziczone, a niech .bashrc
(lub cokolwiek innego wykorzystania) obsługiwać te, które nie są ( set
, shopt
, non-eksportowane zmienne powłoki itp.)
Innym pojęciem jest to, że pliki inicjujące logowanie (i tylko one) powinny wykonywać „ciężkie podnoszenie”, tj. Czynności wymagające dużych zasobów. Na przykład możesz chcieć, aby niektóre procesy działały w tle za każdym razem, gdy jesteś zalogowany (ale tylko jedna ich kopia (instancja)). Możesz chcieć wyświetlać pewne informacje o stanie (np. df
Lub who
) podczas logowania, ale nie za każdym razem, gdy uruchamiasz nową interaktywną powłokę. Zwłaszcza jeśli masz interaktywnyprogram / dialog (tj. taki, który wymaga od ciebie danych wejściowych), który chcesz uruchomić przy każdym logowaniu, prawdopodobnie nie chcesz, aby był uruchamiany przy każdym uruchomieniu nowej powłoki. Jako skrajny przykład, dwadzieścia lat temu Solaris zalogował cię do pojedynczej, nie graficznej powłoki bez okien. (Wierzę, że zmieniło się od tego czasu.) Zadaniem .login
lub .profile
(lub czymkolwiek) było uruchomienie systemu okienkowego za pomocą polecenia podobnego do startx
. (Było to przydatne częściowo dlatego, że dostępnych było wiele systemów okienkowania. Różni użytkownicy mieli różne preferencje. Niektórzy użytkownicy używali różnych systemów w różnych sytuacjach, a my mieliśmy okno dialogowe z .profile
pytaniem „Z jakiego systemu okien chcesz korzystać dzisiaj?”) Oczywiście nie chcesz, aby działało to za każdym razem, gdy otwierasz nowe okno lub piszeszsh
.
Minęło wiele lat, odkąd używałem czegokolwiek innego niż bash
przypadki na krawędzi. (Na przykład piszę skrypty za pomocą #!/bin/sh
, więc w niektórych systemach moje skrypty działają dash
, a w innych działają bash
w trybie POSIX. Kilka razy w roku uruchamiam csh
/ tcsh
przez kilka minut, aby zobaczyć, jak to sobie radzi lub odpowiedz na pytanie.) Jeśli codziennie używasz wielu powłok (np. bash
i zsh
), Twoje wzorce mogą być inne. Jeśli twoja podstawowa powłoka jest (jak zdefiniowano w /etc/passwd
) bash
, możesz wywołać zsh
powłokę logowania, a następnie być może wywołać niektóre interaktywne zsh
powłoki niepodlegające logowaniu . Prawdopodobnie powinieneś unikać posiadania powłoki logowania, która jest podporządkowana innej powłoce logowania tego samego typu.
Jak wspomniano w Różnicy między powłoką logowania a powłoką niezalogowaną? , aplikacja OS X Terminal uruchamia powłokę logowania, więc typowy użytkownik zwykle będzie miał jednocześnie kilka „powłok logowania”. To jest nieco inny od tego modelu, który opisałem powyżej, i może wymagać od użytkownika, aby przemyśleć to, co robi w jego .login
lub.profile
(lub cokolwiek) plik. Nie wiem, czy programiści OS X udokumentowali uzasadnienie tej decyzji projektowej. Ale mogę sobie wyobrazić sytuację, w której byłoby to przydatne. Był czas, kiedy zwykle logowałem się podczas otwierania garści okien powłoki i ustawiałem różne kolory tekstu i tła (pisząc sekwencje specjalne ANSI na ekranie), aby pomóc mi śledzić, który z nich był. Kolory końcowe są przykładem czegoś, co nie jest dziedziczone przez dzieci-dzieci, ale utrzymuje się w oknie. Jest to coś, co chciałbyś robić za każdym razem, gdy uruchamiasz nowe okno Terminalu, ale nie za każdym razem, gdy uruchamiasz nową interaktywną powłokę.