Ich verstehe den grundlegenden Unterschied zwischen einer interaktiven Shell und einer nicht interaktiven Shell. Aber was genau unterscheidet eine Login-Shell von einer Nicht-Login-Shell?
Können Sie Beispiele für die Verwendung einer Nicht-Login-Interaktion geben Schale?
Akzeptierte Antwort:
Eine Anmelde-Shell ist der erste Prozess, der unter Ihrer Benutzer-ID ausgeführt wird, wenn Sie sich für eine interaktive Sitzung anmelden. Der Login-Prozess weist die Shell an, sich wie eine Login-Shell mit einer Konvention zu verhalten:Übergabe des Arguments 0, das normalerweise der Name der ausführbaren Shell-Datei ist, mit einem -
Zeichen vorangestellt (z. B. -bash
während es normalerweise bash
wäre . Login-Shells lesen normalerweise eine Datei, die Dinge wie das Setzen von Umgebungsvariablen tut:/etc/profile
und ~/.profile
für die traditionelle Bourne-Shell ~/.bash_profile
zusätzlich für bash /etc/zprofile
und ~/.zprofile
für zsh, /etc/csh.login
und ~/.login
für csh usw.
Wenn Sie sich an einer Textkonsole oder über SSH oder mit su -
anmelden erhalten Sie ein interaktives Login Hülse. Wenn Sie sich im grafischen Modus (auf einem X-Display-Manager) anmelden, erhalten Sie keine Login-Shell, sondern einen Sitzungs- oder Fenstermanager.
Es kommt selten vor, dass eine nicht interaktive Anmeldung ausgeführt wird Shell, aber einige X-Einstellungen tun dies, wenn Sie sich mit einem Display-Manager anmelden, um das Lesen der Profildateien zu veranlassen. Andere Einstellungen (dies hängt von der Distribution und vom Displaymanager ab) lauten /etc/profile
und ~/.profile
explizit, oder lesen Sie sie nicht. Eine andere Möglichkeit, eine nicht interaktive Login-Shell zu erhalten, besteht darin, sich remote mit einem Befehl anzumelden, der über die Standardeingabe übergeben wird, die kein Terminal ist, z. ssh example.com <my-script-which-is-stored-locally
(im Gegensatz zu ssh example.com my-script-which-is-on-the-remote-machine
, die eine nicht interaktive Shell ohne Anmeldung ausführt).
Wenn Sie eine Shell in einem Terminal in einer bestehenden Sitzung starten (Bildschirm, X-Terminal, Emacs-Terminalpuffer, eine Shell in einer anderen usw.), erhalten Sie eine interaktive Nicht-Anmeldung Hülse. Diese Shell liest möglicherweise eine Shell-Konfigurationsdatei (~/.bashrc
für bash aufgerufen als bash
, /etc/zshrc
und ~/.zshrc
für zsh /etc/csh.cshrc
und ~/.cshrc
für csh die durch ENV
angegebene Datei Variable für POSIX/XSI-kompatible Shells wie dash, ksh und bash, wenn sie als sh
aufgerufen wird , $ENV
falls gesetzt und ~/.mkshrc
für mksh usw.).
Wenn eine Shell ein Skript oder einen Befehl ausführt, der auf ihrer Befehlszeile übergeben wird, handelt es sich um eine nicht interaktive Anmeldung Hülse. Solche Shells laufen ständig:Wenn ein Programm ein anderes Programm aufruft, führt es häufig ein kleines Skript in einer Shell aus, um dieses andere Programm aufzurufen. Einige Shells lesen in diesem Fall eine Startdatei (bash führt die durch BASH_ENV
angegebene Datei aus Variable führt zsh /etc/zshenv
aus und ~/.zshenv
), aber das ist riskant:Die Shell kann in allen möglichen Kontexten aufgerufen werden, und es gibt kaum etwas, was Sie tun können, was nicht etwas kaputt machen könnte.
Ich vereinfache ein wenig, siehe das Handbuch für die blutigen Details.