\chapter{Nützliche Shell-Kommandos}
Durch die gezeigten Steuerungsmöglichkeiten stehen dem Shell-Pro\-grammie\-rer
Möglichkeiten offen, fast alle gängigen Algorithmen zu implementieren. Es ist
tatsächlich in der Shell möglich, Sortier- oder Suchfunktionen zu schreiben.
Leider kommt aber an dieser Stelle einer der bedeutendsten Nachteile der Shell
zum tragen: Die Geschwindigkeit.

In einem Shell-Skript wird für jedes externe Kommando\footnote{Externe
Kommandos sind solche, die nicht direkt in der Shell enthalten sind, für die
also eine eigene Datei aufgerufen wird.} ein eigener Prozeß gestartet. Das
kostet natürlich Zeit und Speicher.

Zeitkritische Anwendungen sind also kein Einsatzgebiet für Shell-Skripte. Die
schreibt man besser in Perl, oder noch besser in einer `compilierten' Sprache
wie C oder C++.

Es stehen jedoch an der Shell viele sehr nützliche externe Kommandos zur
Verfügung, die einem die Entwicklung entsprechender eigener Routinen ersparen.
Diese externen Kommandos sind zudem in anderen Sprachen geschrieben worden, so
daß sie schneller ablaufen als jedes Shell-Skript. Man kommt als
Shell-Programmierer nicht sinnvoll um den Einsatz dieser Programme herum.

In diesem Abschnitt sollen einige dieser Programme mit typischen
Einsatzmöglichkeiten vorgestellt werden. Eine vollständige Beschreibung wäre
(wenn überhaupt möglich) viel zu lang, um an dieser Stelle untergebracht zu
werden. Für ausführlichere Beschreibungen empfiehlt sich das Studium der
Man-Pages oder der Kauf eines entsprechenden Buches. Am besten macht man
natürlich beides. ;-)

\section{Ein- und Ausgabe}\label{ein_und_ausgabe}

Beinahe jedes Skript verwendet in irgendeiner Form die Ein- oder Ausgabe. Sei
es in interaktiver Art auf dem Terminal, oder im Hintergrund auf Dateien.
Einige grundlegende Kommandos in diesem Zusammenhang werden hier vorgestellt.

\subsection{echo}\label{echo}\index{echo=\texttt{echo}|(textbf}

Dies ist wohl der grundlegendste Befehl, der in einem Skript verwendet werden
kann. Er ist die Voraussetzung, um eines der wichtigsten Werkzeuge der
Kybernetik auch mittels eines Shell-Skriptes effizient umzusetzen: Hello World.
:-)

Die eigentliche Aufgabe dieses Befehls dürfte jedem bekannt sein, der sich bis
zu dieser Stelle durchgearbeitet hat. Allerdings wissen viele nicht, daß auch
der echo-Befehl über Parameter verfügt. Zumindest zwei davon erweisen sich in
der Praxis oft als sehr hilfreich:

\LTXtable{\textwidth}{tab_kommandos_echo_parameter.tex}


\subsection{cat}\label{cat}\index{cat=\texttt{cat}|(textbf}

Auch \texttt{cat} ist ein oft unterbewertetes Tool. Seine Aufgabe besteht zwar
lediglich darin, etwas von der Standardeingabe oder aus einer Datei zu lesen,
und das dann auf der Standardausgabe wieder auszugeben. Allerdings leistet es
an vielen, teilweise sehr unterschiedlich gelagerten Aufgaben wertvolle
Dienste.

Durch Umlenklung der Ausgabe können Dateien erzeugt und erweitert werden. So
können mehrere Dateien per \texttt{cat datei1.txt datei2.txt > datei.txt}
verkettet werden.

Außerdem kann man mit einem Aufruf in der Art \texttt{cat datei.txt | kommando}
Daten an ein Programm übergeben, das nur von der Standardeingabe lesen kann
(Filter).

\texttt{cat} verfügt über eine Reige von Parametern, um die Ausgabe zu
formatieren, so können mit \texttt{-n} bzw. \texttt{-b} die Zeilen nummeriert
werden, oder mit \texttt{-s} mehrere Zeilen zu einer einzigen zusammengefaßt
werden.


\subsection{tail}\label{tail}\index{tail=\texttt{tail}|(textbf}

Der Befehl \texttt{tail} gibt die letzten zehn Zeilen einer Datei aus. Wenn
kein Dateiname (oder ein \texttt{-}) angegeben wird, liest \texttt{tail} von
der Standard-Eingabe. Man kann die Anzahl der ausgegebenen Zeilen mit dem
Parameter \texttt{-l} steuern.

Mit dem Parameter \texttt{-f} (follow) gibt \texttt{tail} neue Zeilen aus,
sobald sie an die Datei angehängt werden.


\subsection{head}\label{head}\index{head=\texttt{head}|(textbf}

\texttt{head} ist das Gegenstück zu \texttt{tail} (Siehe \ref{tail}). Hier
werden allerdings nicht die letzten Zeilen angezeigt, sondern die ersten.


\subsection{read}

TODO!!!


\section{Pfade und Dateien}

TODO!!!

\subsection{basename}

TODO!!!

\subsection{touch}

TODO!!!


\section{Pipes manipulieren}

TODO!!!

\subsection{grep}

TODO!!!


\subsection{sed}

TODO!!!


\subsection{awk}

TODO!!!

\subsection{sort}

TODO!!!

\subsection{tee}

TODO!!!

\subsection{wc}

TODO!!!


\section{Sonstige Befehle}\label{sonstige_befehle}

Eine Reihe weiterer Befehle könnte in verschiedenen Lagen hilfreich sein.
Einige davon werden im Folgenden in loser Folge vorgestellt.

\subsection{script}\label{script}\index{script=\texttt{script}|(textbf}

Dieses Kommando eignet sich vorzüglich für das Debuggen fertiger Skripte. Man
ruft es in Verbindung mit einem Dateinamen auf. Dieser Aufruf startet eine neue
Shell, in der man beliebige Kommandos ausführen kann. Wenn man fertig ist,
beendet man den script-Befehl durch die Eingabe von \texttt{exit},
\texttt{logout} oder Druck der Tastenkombination \Ovalbox{CTRL}+\Ovalbox{d}
(EOF).

Script schreibt alle Ein- und Ausgaben die an dem Terminal vorgenommen werden
in die angegebene Datei. So kann man auch interaktive Skripte relativ leicht
debuggen, da sowohl Ein- als auch Ausgaben in dem Logfile sichtbar sind.

\subsection{seq}

TODO!!!

\subsection{expr}

TODO!!!

\subsection{bc}

TODO!!!

\subsection{kill}

TODO!!!

\subsection{sleep}

TODO!!!

\subsection{who}

TODO!!!
