Unix unterscheidet beim Aufruf einer Shell, ob es sich um eine Login-Shell handelt, oder um eine No-Login-Shell.
Der Unterschied ist einfach: Die Login-Shell ist die Shell, die beim Login vom login-Programm gestartet wurde. Jede weitere Shell, die von der Login-Shell aufgerufen wird ist eine No-Login-Shell.
Warum wird zwischen Linux Login Shell und NoLogin unterschieden
Der Grund für diese Unterscheidung liegt in der Frage der Konfigurationsdateien, die wir später noch genauer darstellen werden. Zunächst nur so viel: Die Login-Shell muss konfiguriert werden, sie erhält beim Start viele Variablen, die sie an spätere Linux Shells weitervererbt.
Folgende Konfigurationsdateien werden von der Login-Shell beachtet und setzen Umgebungsvariablen:
- /etc/profile
- ~/.profile
- ~/.bash_profile ( Bourne-Shell )
- /etc/zprofile ( zsh )
- ~/.zprofile ( zsh )
- /etc/csh.login und ~/.login für die csh Shell, usw.
Eine Shell, die wiederum von der Loginshell aufgerufen wird hat diese Konfiguration nicht nötig. Durch die Tatsache, dass Variablen an aufgerufene Shells weitergegeben werden können, erledigt sich das von selbst. Außerdem wäre es eine sehr zeitaufwendige Methode, wenn jede Subshell jedes Mal alle Konfigurationsdateien abarbeiten müsste.
Die Frage, die sich grundsätzlich stellt ist ja auch die, wozu eine Linux Shell denn überhaupt eine Subshell aufruft. Das kommt sehr viel häufiger vor, als auf den ersten Blick ersichtlich. Jedesmal, wenn die Shell ein Script abarbeitet, wird dazu von ihr eine Subshell aufgerufen. Wenn bei jedem Scriptaufruf dann alle Konfigurationsdateien abgearbeitet werden würden, wäre das eine echte Zeitfrage.
Auch in der grafischen Benutzeroberfläche, die ja oft aus einer Shell heraus gestartet wird (startx) erscheinen wieder mehrere xterm-Fenster, in denen jeweils eine Shell läuft. All diese Shells sind keine Login-Shells.