Warum gibt es angemeldete, nicht angemeldete, interaktive und nicht interaktive Bash-Shells?

23

Die bash-Manpages erklären also, was Login und interaktive Shells sind:

Eine Login-Shell ist eine Shell, deren erstes Zeichen des Arguments Null ein - ist, oder eine Shell, die mit der Option --login gestartet wurde.

Eine interaktive Shell wird ohne Nichtoptionsargumente und ohne die Option -c gestartet, deren Standardeingabe und Fehler beide mit Terminals verbunden sind (wie durch isatty (3) bestimmt), oder mit der Option -i gestartet. PS1 ist gesetzt und $ - enthält i, wenn bash interaktiv ist, sodass ein Shell-Skript oder eine Startdatei diesen Status testen kann.

Ich denke, dies bedeutet, dass wir 4 verschiedene Arten von Muscheln haben können:

  • Interaktive Login-Shells,
  • Nicht interaktive Login-Shells,
  • Interaktive Shells ohne Anmeldung
  • Nicht interaktive Shells ohne Anmeldung

Aber warum haben wir überhaupt interaktive / nicht interaktive und Login- / Nicht-Login-Shells? Warum die Sorte? Was würden wir verlieren, wenn wir nur eine Art von Hülle hätten?

Auch beim Versuch, durch Ausführen festzustellen, ob ich mich in einer Anmeldeshell befinde echo $-, wird Folgendes ausgegeben:

himBH

Einige dieser Flags erklärt hier , aber h, Hund mwerden nicht erläutert. Gibt es einen Ort, der all diese Flaggen beschreibt?

TheFooProgrammer
quelle

Antworten:

21

Dies sind meine Gedanken zu den verschiedenen "Arten" von Muscheln - leider habe ich den Aufstieg von Un * x von Anfang an nicht miterlebt (ich gehe davon aus, dass dieses Konzept historisch in einem guten Maße gewachsen ist), seien Sie also bitte kritisch.

  • Wenn ich mich in ein System einlogge (heutzutage über das grafische X-Login), kann es einige Aufgaben geben, die einmal ausgeführt werden müssen, z. B. eine Verbindung zu einem Server herstellen, mir die aktuelle Aufgabenliste anzeigen, einige Befehle automatisch starten usw. Dies sollte nicht jedes Mal glücklich sein, wenn ich ein neues Terminal eröffne. So gibt es eine Reihe von Konfigurationsdateien ( /etc/profile, ~/.bash_loginund so weiter, finden Sie im Handbuch für eine genaue Liste) stammte nur von Login Muscheln.
  • Dementsprechend, um die Verbindungen zu schließen, einige Programme zu beenden, ein Backup-Skript auszuführen, ~/.bash_logoutwenn die Login- Shell existiert.
  • Die "normale" Shell, die ich in einem Terminal verwende, sollte keine Login- Shell sein, aber dennoch meine persönlichen Einstellungen lesen ~/.bashrc, da ich möchte, dass meine Tastenkombinationen mit der Shell interagieren. Login- Shell.
  • und last, but not least, wenn bash für die Skripterstellung verwendet wird, ist beides nicht wichtig. bashsollte so schnell wie möglich starten, dh keine Konfigurationsdateien lesen. Dies ist eine nicht interaktive Shell ohne Anmeldung .

Also, meine Antwort auf Ihre Frage Was würden wir verlieren, wenn wir nur eine Art von Muschel hätten? heißt in einem Wort: "Flexibilität."


Die Antwort auf Ihre zweite Frage ist einfach:

$-listet die aktuellen Optionen auf. Diese können entweder über Kommandozeilenparameter bashoder über das seteingebaute Programm eingestellt werden. Sie müssen sich also zwei Stellen im Handbuch ansehen:

  • OPTIONS Sektion:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSAbschnitt, Unterabschnitt set:

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.
mpy
quelle
1
Woo ich glaube, @mpy Antwort auf OPs klar formulierte Frage ist in der Lage, eine ziemlich nützliche Definition erfolgreich zu desambigieren. Über das: Also, eine Nicht-Login-Shell ist nur eine Teilmenge der Login-Shell, oder?
Tuk0z