% $Id$
\chapter{Was ist die Shell?}\index{Shell}

Die Shell ist ein Programm, mit dessen Hilfe das System die Benutzerbefehle
verstehen kann. Aus diesem Grund wird die Shell auch oft als Befehls- oder
Kommandointerpreter bezeichnet.

\section{Sinn und Zweck}

In einem klassischen Unix-System (ohne die grafische Oberfläche X) greifen die
Benutzer über Terminals\index{Terminal} auf das System zu. Auf diesen Terminals
können nur Textzeichen dargestellt werden. Um dem Benutzer die Arbeit mit dem
System effektiv möglich zu machen, gibt es die Shell. Die Shell wird dabei für
drei Hauptaufgaben benutzt:
\begin{itemize}
\item Interaktive Anwendung (Dialog)
\item Anwendungsspezifische Anpassung des Unix-Systemverhaltens (Belegen von Umgebungsvariablen)
\item Programmierung (Shell-Skripting). Zu diesem Zweck stehen einige Mechanismen zur Verfügung, die aus Hochsprachen bekannt sind (Variablen, Datenströme, Funktionen usw.).
\end{itemize}
Ursprünglich handelte es sich dabei um ein relativ einfaches Programm, der
Bourne Shell (wird oft auch Standard-Shell genannt). Dies ist praktisch die
"`Mutter aller Shells"'. Aus dieser entwickelten sich im Laufe der Zeit mehrere
Varianten, die alle ihre eigenen Vor- und Nachteile mit sich bringen. Da es
unter Unix kein Problem darstellt den Kommandointerpreter auszutauschen, stehen
auf den meisten Systemen mehrere dieser Shells zur Verfügung. Welche Variante
ein Benutzer verwenden möchte ist reine Geschmackssache.

\section{Die Qual der Wahl}

Um die Auswahl einer Shell zu erleichtern, werden hier die wichtigsten
Varianten kurz vorgestellt. Sie sind aufgeteilt in Einfach- und Komfort-Shells.
Die Komfort-Shells zeichnen sich durch komfortablere Funktionen zur
interaktiven Bedienung aus, während die Einfach-Versionen üblicherweise für die
Programmierung benutzt werden.

\medskip\emph{Einfach-Shells:}\nopagebreak

\begin{itemize}
\item Die
Bourne-\index{Bourne-Shell|textbf}\index{Shell>Bourne-|see{Bourne-Shell}} oder
Standard-Shell\index{Shell>Standard-|see{Bourne-Shell}}\index{Standard-Shell|see{Bourne-Shell}}
(\texttt{sh}\index{sh=\texttt{sh}|see{Bourne-Shell}}) ist die kompakteste und
einfachste Form. Sie bietet schon Mechanismen wie die Umlenkung der Ein- oder
Ausgaben, Wildcards zur Abkürzung von Dateinamen, Shell-Variablen und einen
Satz interner Befehle zum Schreiben von Shell-Prozeduren. Neuere Versionen
beherrschen auch das Job-Controlling\index{Job-Controlling}. Für die
Entwicklung von Shell-Skripten sollte man sich auf diese Shell beschränken, da
sie auf praktisch allen Systemen zur Verfügung steht. So bleiben die Skripte
portabel.

\item Die
Korn-Shell\index{Korn-Shell|textbf}\index{Shell>Korn-|see{Korn-Shell}}
(\texttt{ksh}\index{ksh=\texttt{ksh}|see{Korn-Shell}}), eine Weiterentwicklung
der Bourne-Shell, erlaubt das Editieren in der Befehlszeile. Außerdem gibt es
hier History\index{History}-Funktionen\footnote{History-Funktionen ermöglichen
es dem Benutzer, einfach auf zurückliegende Befehle zurückgreifen zu können.},
eine Ganzzahl-Arithmetik, verbesserte Möglichkeiten zur Mustererkennung,
Arrays, Aliase\index{Aliase}\footnote{Ein Alias ist eine Abkürzung für einen
Befehl.  Beispielsweise kann man das Häufig benutzte \texttt{ls -la} einfach
durch \texttt{la} ersetzen.} und das Job-Controlling\footnote{Unter
Job-Controlling versteht man einen Mechanismus, mit dessen Hilfe der Benutzer
die Ausführung von Prozessen selektiv stoppen oder fortsetzen
kann}\index{Job-Controlling}.  Außerdem bietet die Korn-Shell im Gegensatz zu
fast allen anderen Shells die Möglichkeit, Aliase und Shell-Funktionen an
Subshells zu vererben.

\item Die C-Shell \index{C-Shell|textbf}\index{Shell>C-|see{C-Shell}}
(\texttt{csh}\index{csh=\texttt{csh}|see{C-Shell}}) bietet ähnliche
Annehmlichkeiten wie die Korn-Shell, lehnt sich aber in der Syntax sehr stark
an die Programmiersprache C an. Sie sollte nach Möglichkeit nicht zur
Shell-Programmierung benutzt werden, da sie an vielen Stellen nicht so
reagiert, wie man es erwarten sollte.
\end{itemize}

\medskip\emph{Komfort-Shells:}\nopagebreak

\begin{itemize}
\item Die
Bourne-Again-Shell\index{Bourne-Again-Shell|textbf}\index{Shell>Bourne-Again-|see{Bourne-Again-Shell}}\index{Shell>Bash|see{Bourne-Again-Shell}}
(\texttt{bash}\index{bash=\texttt{bash}|see{Bourne-Again-Shell}}) ist voll
abwärtskompatibel zur sh, bietet aber von allen Shells die komfortabelsten
Funktionen für das interaktive Arbeiten. Da die Bash ein GNU-Produkt ist, ist
sie die Standard-Shell auf allen Linux-Systemen. Sie steht aber auch auf den
meisten anderen Unixen zur Verfügung. Die Bash unterstützt
Auto-Completion\index{Auto-Completion|textbf}\footnote{Mit Auto-Completion ist
das automatische Vervollständigen von Dateinamen\index{Dateinamen} gemeint.},
History-Funktionen, Aliase\index{Aliase}, eine Ganzzahl-Arithmetik und
indizierte Arrays\index{Array}.

\item Die
TENEX-C-Shell\index{TENEX-C-Shell|textbf}\index{Shell>TENEX-C-|see{TENEX-C-Shell}}
(\texttt{tcsh}\index{tcsh=\texttt{tcsh}|see{TENEX-C-Shell}}) verhält sich zur
C-Shell wie die Bourne-Again-Shell zur Standard-Shell. Sie ist voll kompatibel,
bietet aber Kom\-fort-Funk\-tio\-nen wie Kom\-man\-do\-zei\-len-Edi\-tie\-rung,
programmierbare Auto-Completion\index{Auto-Completion},
Recht\-schreib\-hil\-fen und eine History.

\item Die Z-Shell\index{Z-Shell|textbf}\index{Shell>Z-|see{Z-Shell}}
(\texttt{zsh}\index{zsh=\texttt{zsh}|see{Z-Shell}}) ähnelt der Korn-Shell,
enthält aber viele Erweiterungen. Die Z-Shell unterstützt
Kom\-mandozeilen-Editing, programmierbares
Auto-Completion\index{Auto-Completion}, Shell-Funktionen und eine History.
Zudem ist eine Rechtschreibprüfung eingebaut.  \end{itemize}

\medskip\emph{Exoten:}\medskip\nopagebreak

Desweiteren gibt es noch eine Reihe weiterer Shells, die aber nur selten
eingesetzt werden. Dazu gehören die
\texttt{ash}\index{ash|textbf}\index{Shell>ash=\texttt{ash}|see{ash}} (Ein
Bourne-Shell-Clone für Rechner mit wenig Speicher.),
\texttt{rc}\index{rc|textbf}\index{Shell>rc=\texttt{rc}|see{rc}} (Noch ein
Bourne-Shell-Clone, ursprünglich aus AT\&T Plan 9. Klein, schnell  und mit eine
C-ähnlichen Syntax.),
\texttt{esh}\index{esh|textbf}\index{Shell>esh=\texttt{esh}|see{esh}} (Klein
und schnell, bietet eine Lisp-ähnliche Sprache),
\texttt{sash}\index{sash|textbf}\index{Shell>sash=\texttt{sash}|see{sash}}
(System Administrator's Shell - eine statisch gelinkte Shell mit integrierten
Stan\-dard-Kom\-man\-dos.).

Diese Liste ist bei weitem nicht vollständig.
