Ich lese immer wieder von interaktiven, nicht interaktiven, Login- und Nicht-Login-Shells.
(Dies geschieht im Kontext dessen, welche der .bash*-Dateien gelesen werden).
Ich verstehe nicht, was die einzelnen Shell-Typen sind, also beginnen wir mit den Grundlagen.
Welcher Shell-Typ wird gestartet, wenn ich von meinem Mac aus per SSH auf meinen Ubuntu-Rechner zugreife?
Antwort1
Wenn Sie sich per SSH mit Ihrer Ubuntu-Box verbinden, erhalten Sie eine interaktive Login-Shell. Hier ist der Unterschied:
Interaktiv vs. nicht interaktiv:Jede Shell, in der Sie in eine Eingabeaufforderung tippen können, ist interaktiv. Tatsächlich testen viele Skripte die Variable
$PS1
, die die Eingabeaufforderungszeichenfolge enthält, um herauszufinden, ob sie interaktiv sind. Wenn eine Shell ein Shell-Skript ausführt, ist sie nicht interaktiv.Wenn Sie also tun
ssh yourbox.example.com
, erhalten Sie eine interaktive Shell mit den Standardeinstellungen. Wenn Sie tunssh yourbox.example.com mighty_shellscript.sh
, erhalten Sie eine nicht interaktive Shell und Ihre SSH-Sitzung wird beendet, wenn das Skript beendet wird.Mit Anmeldung vs. ohne Anmeldung:Wenn Sie sich von der Konsole oder aus der Ferne (z. B. per SSH) anmelden oder die
-l
Option an übergebenbash
, erhalten Sie eine Login-Shell. Andernfalls – z. B. wenn Sie ein Terminalfenster öffnen – erhalten Sie eine Nicht-Login-Shell.Um zu testen, ob es sich bei einer Shell um eine Login-Shell handelt, überprüfen Sie, ob ihr Befehlsname
-bash
anstelle von lautetbash
:ps -ef | grep [b]ash
Antwort2
Sie erhalten eine interaktive Login-Shell. Aber nehmen Sie das nicht als selbstverständlich hin, testen Sie es selbst.
Dies zeigt Ihnen, dass Sie über eine Login-Shell verfügen (von man bash
):
# shopt | grep login
login_shell on
Dies zeigt Ihnen, dass Sie eine interaktive Shell haben. Suchen Sie nach i
(von man bash
):
# echo $-
himBH
Die interaktive Anmelde-Shell, die Sie erhalten, hat gelesen /etc/profile
und als eines von ~/.bash_profile
, ~/.bash_login
und ~/.profile
, wie in erläutert man bash
:
Wenn bash aufgerufen wird als interaktive Login-Shell, oder als nicht-interaktive Shell mit der Option --login,es liest und führt zuerst Befehle aus der Datei /etc/profile aus, falls diese Datei existiert. Nachdem diese Datei gelesen wurde, sucht es in dieser Reihenfolge nach ~/.bash_profile, ~/.bash_login und ~/.profile und liest und führt Befehle aus der ersten Datei aus, die existiert und lesbar ist. Um dieses Verhalten zu unterbinden, kann beim Starten der Shell die Option --noprofile verwendet werden.
Antwort3
Derssh(1)In der Manpage heißt es:
WennBefehlangegeben ist, wird es auf dem Remote-Host anstelle einer Login-Shell ausgeführt.
Und
Wenn die Identität des Benutzers vom Server akzeptiert wurde, führt der Server entweder den angegebenen Befehl aus oder meldet sich beim Computer an und gibt dem Benutzer eine normale Shell auf dem Remotecomputer.
Das lässt für mich darauf schließen, dass es sich bei der Shell, die Sie erhalten, um eine Login-Shell handelt.
Antwort4
Versuchen Sie diesen Befehl.
[max@localhost ~]$ echo $SHELL /bin/bash
Sie erhalten diese Ausgabe, weil Ihr Shell-Typ in dieser Variable gespeichert ist SHELL
.
Um Ihre Umgebungsvariable herauszufinden, geben Sie diesen Befehl ein
[max@localhost ~]$ Umgebung . . . HOSTNAME=localhost.localdomain SHELL=/bin/bash HISTSIZE=1000 USER=max . . .
während der Eingabe echo $SHELL
wird der hier gespeicherte Wert ausgedruckt
Dieser Wert wird bei jedem Systemstart aktualisiert.