HOWTO · Linux

Unterschied zwischen einer Anmelde-Shell und einer Nicht-Anmelde-Shell

Dieses Tutorial erklärt den Unterschied zwischen einer Login-Shell und einer Nicht-Login-Shell in UNIX-basierten Systemen.

Auf dieser Seite

Eine Login-Shell und eine Non-Login-Shell unterscheiden sich darin, wie die Shell gestartet wurde. Das wirkt sich auf die Startkonfiguration aus. Dieser Leitfaden erläutert den Unterschied auf UNIX-basierten Systemen und zeigt am Beispiel von Bash, wie Sie den Shell-Status prüfen und einen bestimmten Aufruf wählen. Der Login-Status ist unabhängig davon, ob eine Shell interaktiv ist.

Was ist eine Shell?

Eine Shell ist ein Programm, das Befehle einliest und das Betriebssystem auffordert, sie auszuführen. Bash ist eine weitverbreitete Shell. Eine Shell kann außerdem Konfigurationsdateien einlesen, die Variablen setzen, Aliase definieren und die Eingabeaufforderung konfigurieren. Welche Dateien Bash einliest, hängt davon ab, wie die Shell aufgerufen wurde. Deshalb können für dieselbe Person in verschiedenen Sitzungen unterschiedliche Einstellungen gelten.

Hier sind zwei Eigenschaften wichtig: Eine Shell ist eine Login-Shell, wenn sie im Login-Modus aufgerufen wird. Sie ist interaktiv, wenn sie Befehle über eine für Benutzer bestimmte Eingabeaufforderung einliest. Diese Eigenschaften sind voneinander unabhängig. Ein Terminal kann eine interaktive Non-Login-Shell starten, und ein Skript kann eine nicht interaktive Shell starten.

Login-Shells und Non-Login-Shells

Eine Login-Shell ist eine Shell, die im Login-Modus aufgerufen wird. Bei Bash gehört dazu ein Aufruf mit --login oder mit einem Namen, der einem Login-Aufruf entspricht. Dieser Status beschreibt, wie die Shell aufgerufen wurde; für sich genommen beweist er weder, dass eine Authentifizierung stattgefunden hat, noch dass eine Benutzeranmeldesitzung begonnen hat. Eine Anmeldung an einer Textkonsole, SSH und Werkzeuge zum Benutzerwechsel sind typische Situationen, in denen je nach Befehl und Konfiguration eine Login-Shell gestartet werden kann. Eine Login-Shell ist nicht als erster von /bin/login gestarteter Prozess definiert; dieses Programm kann Teil eines Anmeldeablaufs sein.

Eine Non-Login-Shell wird ohne Login-Modus gestartet. Sie tritt häufig auf, wenn eine interaktive Shell eine weitere Shell startet oder ein Terminalemulator eine neue Eingabeaufforderung öffnet. Eine Shell, die einen Befehl oder ein Skript ausführt, ist normalerweise nicht interaktiv und nicht zwingend eine Login-Shell. Das sind typische Muster, aber keine Garantien für jedes Terminal oder jeden Dienst.

Eigenschaft Login-Shell Non-Login-Shell
Bedeutung Im Login-Modus aufgerufen Ohne Login-Modus aufgerufen
Typische Konfiguration Login-Startdateien Interaktive Bash liest normalerweise ~/.bashrc
Unabhängige Eigenschaft Kann interaktiv oder nicht interaktiv sein Kann interaktiv oder nicht interaktiv sein

Unterschiede bei den Bash-Startdateien

Eine Login-Shell von Bash liest zuerst /etc/profile und danach die erste lesbare Benutzerdatei aus ~/.bash_profile, ~/.bash_login und ~/.profile. Diese Dateien können weitere Konfigurationen einlesen. Bash lädt ~/.bashrc nicht grundsätzlich über eine Login-Datei; Benutzer fügen diese Anweisung häufig selbst hinzu. Eine interaktive Non-Login-Shell von Bash liest ~/.bashrc. Eine nicht interaktive Bash verwendet BASH_ENV, wenn diese Variable eine Datei angibt. Dateien der Distribution, etwa /etc/bashrc oder Dateien unter /etc/profile.d, werden auf manchen Systemen durch die System- oder Benutzerkonfiguration eingebunden. Sie gehören nicht zu einer universellen Bash-Abfolge.

Die Reihenfolge ist wichtig, weil spätere Zuweisungen frühere Werte überschreiben können. Wenn eine Einstellung nur in einer bestimmten Art von Sitzung erscheint, ermitteln Sie zuerst den Login- und Interaktivitätsstatus der Shell. Prüfen Sie dann die passende Startdatei und alle Dateien, die sie einliest. Änderungen an Startdateien wirken sich auf künftige Shells aus; eine bereits laufende Shell wird dadurch nicht automatisch aktualisiert.

Shell-Arten erkennen und starten

In Bash lässt sich der Login-Status direkt anhand der Shell-Option login_shell prüfen. shopt -q ist erfolgreich, wenn die Option aktiviert ist. Der Name $0 kann bei einer Login-Shell mit - beginnen. Programme und Wrapper können diesen Namen jedoch ändern; er ist daher nur ein Hinweis und kein eindeutiger Nachweis. Prüfen Sie die Interaktivität separat, indem Sie testen, ob das Flag i in $- enthalten ist.

Führen Sie dieses Bash-Beispiel aus, um die aktuelle Shell zu untersuchen und eine untergeordnete Shell mit einem ausdrücklich festgelegten Modus zu starten:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

printf 'Current Bash login status: '
if shopt -q login_shell; then
  printf 'login\n'
else
  printf 'non-login\n'
fi

printf 'Child Bash login status: '
bash --login -c 'if shopt -q login_shell; then printf "login\\n"; else printf "non-login\\n"; fi'

case $- in
  *i*) printf 'Current Bash is interactive\n' ;;
  *)   printf 'Current Bash is non-interactive\n' ;;
esac
Current Bash login status: non-login
Child Bash login status: login
Current Bash is non-interactive

Mit bash --login fordern Sie eine Login-Shell von Bash an; mit bash starten Sie eine Non-Login-Shell von Bash. Ergänzen Sie -i, wenn die untergeordnete Shell ausdrücklich interaktiv sein soll; eine interaktive Shell ist nicht automatisch eine Login-Shell. Mit bash --login -i fordern Sie beispielsweise beide Eigenschaften an. Verwenden Sie beim Testen des Startverhaltens eine neue Shell und berücksichtigen Sie die lokale Konfiguration, die weitere Dateien einlesen kann. Die Beispielausgabe und ihre Bezeichnungen bleiben im unveränderten Code- und Ausgabeblock auf Englisch.

Eine Terminalillustration mit der Beschriftung „Login-Shell“

Eine Terminalillustration mit der Beschriftung „Non-Login-Shell“