Logo Wissenstransfer Gerhard at CichnaDotCom

>> Wissensdatenbank / Linux

Grundlagen der Shell

Eine Shell ist das Programm, in das man Befehle und Kommandos zum Aufruf von anderen Programmen eingibt. Die Shell interpretiert das Kommando (daher werden Shells auch oft als Kommandointerpreter bezeichnet) und leitet es bei Bedarf an den Kernel weiter.

Einführung und Überblick

Von einer Shell aus werden alle Programme der Arbeitssession gestartet.
Das $-Zeichen (manchmal auch eine Ausgabe wie benutzer@rechner$ oder beim Superuser das #-Zeichen) fordert zur Eingabe von Befehlen auf. Zum beenden gibt man exit ein oder drückt STRG + D.

Welche Shells gibt es?

Die populärsten Shells sind:


Die meisten populären Distributionen setzen die bash als Standardshell ein.

Die Shell als Programm

Die Shell ist ein Programm wie jedes andere, welches über den Aufruf des Programmnamens gestartet wird. Normalerweise übernimmt das Programm getty bzw. systemd diesen Startvorgang nach dem Login. Man kann jedoch eine Shell in der Shell starten. Beim Verlassen einer auf diese Weise gestarteten Shell befindet man sich wieder in der vorherigen Shell. Beendet man jedoch die Login-Shell, loggt man sich aus dem System aus.
user$ ksh  // Start der Korn-Shell
$ csh  // Start der C-Shell
% exit  // zurück zur Korn-Shell
$ exit  // zurück zur Login-Shell
user$ exit  // Beenden der Shellsession
logout

myhost login:  // Rechner wartet auf erneute Anmeldung

Der Prompt

Eine Shell verfügt über einen Standardprompt. Es gibt zudem noch einige Nebenprompts. Je nach Shell - und besonders nach der persönlichen Konfiguration - sehen diese Prompts anders aus. Die bash bietet an dieser Stelle eine Menge Möglichkeiten zur Gestaltung. Nach dem Start der bash sieht man in der Regel Folgendes:
Benutzer@Hostname:~$, wobei ~ das aktuelle Arbeitsverzeichnis ist.

Der Prompt wird über eine Variable mit dem Namen PS1 gestaltet. Im folgenden Beispiel wird über das echo-Programm der Inhalt der PS1-Variablen ausgegeben und anschließend neu gesetzt. Mit dem unset-Kommando kann der Prompt gelöscht werden.

user$ PS1="prompt > "
prompt > PS1="Gerhard% "
Gerhard% unset PS1
PS1="user$ "

Dieser Prompt bietet jedoch noch keine praktischen Features wie die Anzeige des Arbeitsverzeichnisses. Für Aufgaben dieser Art werden sogenannte Escapesequenzen (siehe folgende Tabelle) in den Prompt eingebettet. Es existieren noch weitere Escapesequenzen, die beispielsweise zur Festsetzung der farblichen Hervorhebung dienen.

Sequenz Wirkung
\a Ausgabe eines Tons im PC-Lautsprecher
\d zeigt das Datum an
\e Escapezeichen
\h der Hostname (z.B. "rechner")
\H FQDN-Hostname (z.B. "rechner.netzwerk.edu")
\j Anzahl der Hintergrundprozesse
\l Name des Terminals
\n neue Zeile (Prompts können über mehrere Zeilen verteilt werden)
\r Carriage-Return
\s der Name der Shell
\t Zeit im 24-Stunden-Format
\T Zeit im 12-Stunden-Format
\@ Zeit im AM/PM-Format
\u der Name des Benutzers
\v die Version der bash
\V wie \v, jedoch mit Patch-Level
\w gibt das Arbeitsverzeichnis an (mit Pfad)
\W gibt das Arbeitsverzeichnis an (ohne Pfad)
\# Anzahl der bereits aufgerufenen Kommandos während der
Shellsession des Terminals
\$ Ist man als normaler Benutzer eingeloggt, erscheint ein
Dollarzeichen ($), root bekommt eine Raute (#) zu sehen
\\ ein Backslash

Beispiel für das Setzen des bash-Prompt mit Escapesequenzen:
user$ PS1="\d$ "
Mo Aug 22$ ls

Shellintern vs. Programm

In der Shell werden Programme gestartet. Hierbei gibt es zwei unterschiedliche Gruppen von Befehlen. Die eine Gruppe besteht aus den tatsächlichen auf der Festplatte abgelegten Programmen. Die andere Gruppe ist shellintern: Sie wurde in die Shell "reinprogrammiert" und wird daher auch als Builtin bezeichnet.

type

Ob ein Kommando intern bzw. extern ist, kann mit dem Programm type ermittelt werden:
$ type kill<
kill ist eine von der Shell mitgelieferte Funktion.

$ type ls ls ist ein Alias von "ls --color=auto"

alias

In der Shell kann ein sogenannter Alias angelegt werden. Das ist ein Befehl, der einen anderen ersetzt. type gibt darüber Auskunft, ob ein Kommando ein solcher Alias ist.
$ type ls
ls ist ein Alias von "ls --color=auto"

Gibt man in der bash einfach nur kill ein, wird die shellinterne Variante benutzt. Bei /bin/kill wird hingegen das Programm aus dem entsprechenden Verzeichnis verwendet.

Kommandos aneinanderreihen

Verschiedene Kommandos in der Shell können aneinandergereiht werden. Der Grund für eine Aneinanderreihung ist die Platzersparnis auf dem Bildschirm und auch die zeitweise Abarbeitung der Kommandos.

Der Trennungsoperator

Szenario 1: Die Kommandos sollen der Reihe nach ablaufen, egal, was mit den vorherigen Kommandos geschieht. Für diesen Fall verwendet man den Trennungsoperator - das Semikolon (;).
Beispiel:
user$ ls VerZeiChniS; uname; uptime
ls: Zugriff auf 'VerZeiChniS' nicht möglich: Datei oder Verzeichnis nicht gefunden
Linux
15:39:19 up 20 days, 23:37, 3 users, load average: 0,11, 0,09, 0,09

Unabhängig vom Resultat des ls-Kommandos werden alle anderen Kommandos ausgeführt.

Weiter nur bei Erfolg

Szenario 2: Die Kommandos sollen der Reihe nach ausgeführt werden, vorausgesetzt, das jeweils vorangegangene war erfolgreich. Ansonsten wird das nächste Programm nicht gestartet und die Abarbeitung gestoppt. Man schreibt hierfür anstelle des Trennungsoperators ein doppeltes kaufmännisches Und-Zeichen (&&).
Beispiel:
user$ ls VerZeiChniS && uname && uptime
ls: Zugriff auf 'VerZeiChniS' nicht möglich: Datei oder Verzeichnis nicht gefunden

Programme liefern einen sogenannten Rückgabewert an die Shell zurück, mittels dem die Shell weiß, ob ein Kommando korrekt ausgeführt wurde.

Weiter nur bei Fehlschlag

Als Alternative gibt es ||: Der hintere Befehl wird nur ausgeführt, falls der zuvor fehlschlägt.
Beispiel:
user$ ls VerZeiChniS || echo "HILFE!"
ls: Zugriff auf 'VerZeiChniS' nicht möglich: Datei oder Verzeichnis nicht gefunden
HILFE!

Mehrzeilige Kommandos

Erstreckt sich die Kommandoeingabe über mehrere Zeilen, kann mit dem Backslash-Operator (/) die aktuelle Eingabezeile in der nächsten Zeile fortgesetzt werden.
Beispiel:
user$ find Programmieren/Wissensdatenbank/linux/ \
-name shell_einfuehrung.html
Programmieren/Wissensdatenbank/linux/shell_einfuehrung.html