WARUM eine ** Login ** Shell über eine ** Non-Login ** Shell?

24

Ich verstehe Dotfiles im * nix-System grundlegend . Aber ich bin immer noch ziemlich verwirrt über diesen Unterschied zwischen Login-Shell und Nicht-Login-Shell?

Eine Reihe verschiedener Antworten (einschließlich mehrfacher Duplikate) haben bereits die folgenden Aufzählungszeichen angesprochen:

  • So rufen Sie eine Anmelde- oder Nicht-Anmelde- Shell auf
  • So erkennen Sie eine Login- oder Nicht-Login- Shell
  • Welche Startdateien werden von einer Anmelde- oder Nicht-Anmelde- Shell verwendet ?
  • man bashWeitere Informationen finden Sie in der Dokumentation (z. B. )

Was die Antworten nicht sagten (und auch etwas, über das ich immer noch verwirrt bin), ist:

  • Was ist der Anwendungsfall einer Login- oder Nicht-Login- Shell? (ZB habe ich nur zshrcfür konfiguriert zshund das ist genug für die meisten persönlichen Entwickleranforderungen. Ich weiß, es ist nicht so einfach wie das vimrc, was zu tun ist. vim)

  • Was ist der Grund , warum ein Login über eine Nicht-Login- Shell verwendet wird (abgesehen vom Verbrauch verschiedener Startdateien und Lebenszyklen)?

Xlee
quelle

Antworten:

15

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 umaskusw.) von der Anmeldeshell. Und dementsprechend ist die Idee , dass die Login - Initialisierungsdateien ( .login, .profileusw.) 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. dfoder 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 .loginoder .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 .profilegefragt, 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 dashund auf anderen bashim POSIX-Modus ausgeführt werden. Einige Male im Jahr führe ich csh/ tcsheinige 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. bashund zsh) verwenden, können Ihre Muster unterschiedlich sein. Wenn es sich bei Ihrer primären Shell (wie in definiert /etc/passwd) bashum eine zshAnmeldeshell handelt , möchten Sie möglicherweise eine Anmeldeshell aufrufen und anschließend möglicherweise einige interaktive zshShells, 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 .loginoder 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.

G-Man sagt, "Monica wiedereinsetzen"
quelle