Die Idee ist, dass ein Benutzer (höchstens) eine Login-Shell pro Host haben sollte. (Vielleicht sollte ich sagen, eine Login-Shell pro Host und Terminal - wenn Sie gleichzeitig über mehrere Terminals bei einem Host angemeldet sind, erwarten Sie mehrere Login-Shells.) Dies ist normalerweise (immer?) Die erste Shell, die Sie erhalten beim Einloggen (daher der Name). Mit diesem Schema können Sie also Aktionen angeben, die nur einmal pro Anmeldung ausgeführt werden sollen, sowie Aktionen, die bei jedem Start einer neuen (interaktiven) Shell ausgeführt werden sollen.
Normalerweise ist jede andere Shell, die Sie nach dem Anmelden ausführen, ein Nachkomme (ein Kind eines Kindes eines Kindes ...) der Anmeldeshell und erbt daher viele Einstellungen (Umgebungsvariablen umask
usw.) von der Anmeldeshell. Und dementsprechend ist die Idee , dass die Login - Initialisierungsdateien ( .login
, .profile
usw.) sollten Sie die Einstellungen festlegen , die vererbbar sind, und lassen Sie .bashrc
(oder was auch immer Sie verwenden) behandeln diejenigen , die nicht ( set
, shopt
, nicht exportierte Shell - Variablen , etc.)
Ein weiterer Gedanke ist, dass die Anmeldeinitialisierungsdateien (und nur sie) "Heavy Lifting" durchführen sollten, dh ressourcenintensive Aktionen. Beispielsweise möchten Sie möglicherweise, dass bestimmte Prozesse im Hintergrund ausgeführt werden, wenn Sie angemeldet sind (jedoch nur eine Kopie (Instanz) davon). Möglicherweise möchten Sie beim Anmelden einige Statusinformationen (z. B. df
oder who
) anzeigen lassen, jedoch nicht jedes Mal, wenn Sie eine neue interaktive Shell starten. Vor allem, wenn Sie eine interaktive habenProgramm / Dialogfeld (dh ein Programm, das Eingaben von Ihnen erfordert), das Sie bei jeder Anmeldung ausführen möchten, und das Sie wahrscheinlich nicht bei jedem Start einer neuen Shell ausführen möchten. Als extremes Beispiel hat Sie Solaris vor zwanzig Jahren bei einer einzelnen, nicht grafischen Shell ohne Fenster angemeldet. (Ich glaube, dass es sich seitdem geändert hat.) Es war die Aufgabe von .login
oder .profile
(oder was auch immer), das Fenstersystem mit einem Befehl wie zu starten startx
. (Dies war unter anderem deshalb nützlich, weil mehrere Fenstersysteme verfügbar waren. Verschiedene Benutzer hatten unterschiedliche Vorlieben. Einige Benutzer verwendeten unterschiedliche Systeme in unterschiedlichen Situationen. In unserem Dialogfeld wurde .profile
gefragt, welches Fenstersystem Sie heute verwenden möchten.) Natürlich möchten Sie nicht, dass dies jedes Mal ausgeführt wird, wenn Sie ein neues Fenster öffnen oder tippensh
.
Es ist Ewigkeiten her, seit ich etwas anderes als Randfälle verwendet habe bash
. (Zum Beispiel schreibe ich Skripte mit #!/bin/sh
, so dass auf einigen Systemen meine Skripte mit dash
und auf anderen bash
im POSIX-Modus ausgeführt werden. Einige Male im Jahr führe ich csh
/ tcsh
einige Minuten lang aus, um zu sehen, wie es mit etwas umgeht oder um Beantworten Sie eine Frage.) Wenn Sie täglich mehrere Muscheln (z. B. bash
und zsh
) verwenden, können Ihre Muster unterschiedlich sein. Wenn es sich bei Ihrer primären Shell (wie in definiert /etc/passwd
) bash
um eine zsh
Anmeldeshell handelt , möchten Sie möglicherweise eine Anmeldeshell aufrufen und anschließend möglicherweise einige interaktive zsh
Shells, die nicht der Anmeldeshell zugeordnet sind. Sie sollten wahrscheinlich vermeiden, eine Anmeldeshell zu haben, die einer anderen Anmeldeshell desselben Typs untergeordnet ist.
Wie in Unterschied zwischen Anmeldeshell und Nicht-Anmeldeshell erwähnt? Wenn die OS X-Terminalanwendung eine Anmeldeshell ausführt, werden für einen typischen Benutzer in der Regel mehrere Anmeldeshells gleichzeitig ausgeführt. Dies ist ein etwas anderes Modell als das, das ich oben beschrieben habe, und der Benutzer muss möglicherweise überdenken, was er in seinem .login
oder tut.profile
(oder was auch immer) Datei. Ich weiß nicht, ob die OS X-Entwickler ihre Gründe für diese Entwurfsentscheidung dokumentiert haben. Aber ich kann mir eine Situation vorstellen, in der dies nützlich wäre. Es gab eine Zeit, in der ich beim Anmelden gewöhnlich eine Handvoll Shell-Fenster öffnete und sie auf unterschiedliche Text- und Hintergrundfarben einstellte (indem ich ANSI-Escape-Sequenzen auf den Bildschirm schrieb), um festzustellen, welches Fenster welches war. Terminalfarben sind ein Beispiel für etwas, das nicht von Kindern von Kindern geerbt wird, sondern in einem Fenster erhalten bleibt. So etwas möchten Sie also jedes Mal tun, wenn Sie ein neues Terminalfenster starten, aber nicht jedes Mal, wenn Sie eine neue interaktive Shell starten.