[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal:] - einen Terminal öffnen }}} [[Inhaltsverzeichnis()]] Eine [:Shell:] (z.B. [:Bash:], [:Dash:], '''sh''' usw.) kann in verschiedenen Modi ausgeführt werden. Jede Shell kann: * eine interaktive oder nicht-interaktive Shells sowie * eine Loginshell oder nicht-Loginshell sein. Daraus ergeben sich insgesamt die vier Kombinationen: interaktive Loginshell, nicht-interaktive Loginshell, interaktive Nicht-Loginshell, nicht-interaktive Nicht-Loginshell. Die Unterscheidung zwischen den vier Modi einer Shell ist insofern wichtig, als dass je nach Modus verschiedene Kofigurationsdateien eingelesen werden und damit je nach Modus unterschiedliche bzw. unterschiedliche viele [:Umgebungsvariable:Umgebungsvariablen] standardmäßig vorhanden sind. Öffnet man ein [:Terminal:] in einer [:Desktop:Desktopumgebung], befindet man sich in einer interaktiven Nicht-Loginshell. Das ist also der Shelltyp, den man als "normaler" Desktopbenutzer am häufigsten nutzt. = interaktive / nicht-interaktive Shell = Eine interaktive Shell ist mit einem Terminal (Tastatur, Bildschirm) verbunden, über welches sie von einem Benutzer eingegebene Befehle entgegen nimmt und die Ergebnisse der ausgeführten Kommandos ausgibt. Beispiele für den Aufruf von interaktiven Shells sind: * ein Terminal in der Desktopumgebung öffnen * eine [:Terminal/#Virtuelle-Konsole:virtuelle Konsole] nach dem Systemstart aufrufen und sich dort einloggen * sich über [:SSH:] an einem anderen System anmelden Eine nicht-interaktive Shell hat keinen direkten Kontakt zu einem Benutzer. Sie läuft im Hintergrund, ohne Interaktion mit dem Nutzer. Beispiele für nicht-interaktive Shells sind: * Shells, in denen während des Bootvorgangs Skripte ausgeführt werden * Shells, in denen man einen Befehl per SSH ausführt, wie z.B. `ssh NUTZER@IP_DES_RECHNERS ''` == Prüfen auf interaktive Shell == Um zu prüfen, ob man sich in einer interaktiven Shell befindet, kann folgender Befehl genutzt werden:[1] {{{#!vorlage Befehl echo $- }}} Es werden die Flags der laufenden Shell ausgegeben. Ist in der Ausgabe ein kleines `i` enthalten, läuft die Shell interaktiv. Der Befehl funktioniert sowohl in der Bash, Dash als auch sh. = Login- / Nicht-Loginshell = Eine Loginshell kann man auf zwei Wegen erhalten * nach dem Anmelden landet in einer initialen Shell * man startet ein Shell mit der Option `-l` oder `--login` Entgegen des Namens muss, um in eine Loginshell zu gelangen, nicht zwingend ein Loginvorgang notwendig sein. Beispiele für eine Loginshell sind: * sich über [:SSH:] auf einem anderen System einloggen * eine [:Terminal/#Virtuelle-Konsole:virtuelle Konsole] nach dem Systemstart aufrufen und sich dort einloggen * als ein anderes Nutzer aus einer laufenden Shell eine neue Shell starten, z.B. über `su -l NUTZERNAME` * Aufruf des Befehls `bash -l` oder `dash -l` Beispiele für eine Nicht-Loginshell sind: * einen Terminal in der Desktopumgebung öffen * Shells, in denen während des Bootvorgangs Skript ausgeführt werden * Shells, in denen einen Befehl per SSH ausführt, wie z.B. `ssh NUTZER@IP_DES_RECHNERS 'echo $SHELL'` == Prüfen auf Loginshell == Um zu prüfen, ob man sich in einer initialen Loginshell oder Nicht-Loginshell befindet, führt man den folgenden Befehl aus[1] {{{#!vorlage Befehl echo $0 }}} Dabei wird ausgegeben, welche Shell man gerade verwendet (also Bash, Dash etc.). Beginnt die Ausgabe mit einem Minuszeichen `-`, gefolgt vom Shellnamen, befindet man sich in einer initialen Loginshell. Erscheint nur der Shellname, ist man in einer Nicht-Loginshell: {{{ #Ausgabe für eine Loginshell: -bash #Augabe für eine Nicht-Loginshell: bash }}} Startet man allerdings z.B. ein Bash-Shell mit der Option `-l` bzw. `--login`, erhält man auch die Ausgabe `bash`, also ohne führendes `-`. Um bei bei solch einer Bash zu prüfen, ob es sich um eine Loginshell handelt, kann der folgende Befehl verwendet werden: {{{#!vorlage Befehl shopt | grep login_shell }}} Ausgabe: {{{ #für eine Loginshell: login_shell on #für eine Nicht-Loginshell: login_shell off }}} In Shellskripten kann man auch folgenden Code verwenden: {{{#!code bash if [ -n "$loginshell" ] then echo "Loginshell" fi }}} = Beispiele für alle vier Kombinationen = Im folgenden einige Beispiele für alle vier mögliche Kombinationen: {{{#!vorlage Tabelle Beispiele vor verschiedene Shellkombinationen +++ Loginshell Nicht-Loginshell +++ '''interaktive Shell''' • sich über [:SSH:] auf einem anderen System einloggen[[BR]]• eine [:Terminal/#Virtuelle-Konsole:virtuelle Konsole] nach dem Systemstart aufrufen und sich dort einloggen[[BR]]• Starten der Shell mit `bash -l` oder `dash -l` • einen Terminal in der Desktopumgebung öffnen +++ '''nicht-interaktive Shell''' • über SSH einen Befehle ausführen, z.B. `ssh NUTZER@IP_DES_RECHNERS 'hostname'` • Shells, in denen während des Bootvorgangs Skripte ausgeführt werden[[BR]]• einen Befehl / Skript in einer anderen Shell ausführen: `sh -C SKRIPT_ODER_BEFEHL` }}} = Links = * {Übersicht} [:Shell:] - Übersichtsartikel zum Thema Shell * [https://docstore.mik.ua/orelly/unix3/upt/ch03_04.htm Erklärung] {en} zu Loginshells und interaktiven Shells * [askubuntu:155865/what-are-login-and-non-login-shells:Erklärung bei askubuntu] {en} zu Login- / Nicht-Loginshells * [https://unix.stackexchange.com/questions/26676/how-to-check-if-a-shell-is-login-interactive-batch Thread bei stackexchange.com] {en}, welcher Tests auf Loginshell / interaktiver Shell für diverse anderes Shells wie fish, csh und tcsh zeigt # tag: Shell, System