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.
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.
Die populärsten Shells sind:
bash als Standardshell ein.
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
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
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.
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"
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.
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.
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.
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.
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!
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