2001-07-02 12:52:18 +00:00
|
|
|
|
\chapter{N<EFBFBD>tzliche Shell-Kommandos}
|
|
|
|
|
Durch die gezeigten Steuerungsm<73>glichkeiten stehen dem Shell-Pro\-grammie\-rer
|
|
|
|
|
M<EFBFBD>glichkeiten offen, fast alle g<>ngigen Algorithmen zu implementieren. Es ist
|
|
|
|
|
tats<EFBFBD>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<7A> gestartet. Das
|
|
|
|
|
kostet nat<61>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<EFBFBD>gung, die einem die Entwicklung entsprechender eigener Routinen ersparen.
|
|
|
|
|
Diese externen Kommandos sind zudem in anderen Sprachen geschrieben worden, so
|
|
|
|
|
da<EFBFBD> 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<EFBFBD>glichkeiten vorgestellt werden. Eine vollst<73>ndige Beschreibung w<>re
|
|
|
|
|
(wenn <20>berhaupt m<>glich) viel zu lang, um an dieser Stelle untergebracht zu
|
|
|
|
|
werden. F<>r ausf<73>hrlichere Beschreibungen empfiehlt sich das Studium der
|
|
|
|
|
Man-Pages oder der Kauf eines entsprechenden Buches. Am besten macht man
|
|
|
|
|
nat<EFBFBD>rlich beides. ;-)
|
|
|
|
|
|
2001-07-02 16:53:41 +00:00
|
|
|
|
\section{Ein- und Ausgabe}\label{ein_und_ausgabe}
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
2001-07-02 16:53:41 +00:00
|
|
|
|
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.
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
2001-07-02 16:53:41 +00:00
|
|
|
|
\subsection{echo}\label{echo}\index{echo=\texttt{echo}|(textbf}
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
2001-07-02 16:53:41 +00:00
|
|
|
|
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<64> auch
|
|
|
|
|
der echo-Befehl <20>ber Parameter verf<72>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}
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
2001-07-02 16:53:41 +00:00
|
|
|
|
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.
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
2001-07-02 16:53:41 +00:00
|
|
|
|
Durch Umlenklung der Ausgabe k<>nnen Dateien erzeugt und erweitert werden. So
|
|
|
|
|
k<EFBFBD>nnen mehrere Dateien per \texttt{cat datei1.txt datei2.txt > datei.txt}
|
|
|
|
|
verkettet werden.
|
|
|
|
|
|
|
|
|
|
Au<EFBFBD>erdem kann man mit einem Aufruf in der Art \texttt{cat datei.txt | kommando}
|
|
|
|
|
Daten an ein Programm <20>bergeben, das nur von der Standardeingabe lesen kann
|
|
|
|
|
(Filter).
|
|
|
|
|
|
|
|
|
|
\texttt{cat} verf<72>gt <20>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<66>t
|
|
|
|
|
werden.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\subsection{tail}\label{tail}\index{tail=\texttt{tail}|(textbf}
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
|
|
|
|
TODO!!!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\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!!!
|
|
|
|
|
|
|
|
|
|
|
2001-07-02 16:53:41 +00:00
|
|
|
|
\section{Sonstige Befehle}\label{sonstige_befehle}
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
2001-07-02 16:53:41 +00:00
|
|
|
|
Eine Reihe weiterer Befehle k<>nnte in verschiedenen Lagen hilfreich sein.
|
|
|
|
|
Einige davon werden im Folgenden in loser Folge vorgestellt.
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
2001-07-02 15:32:33 +00:00
|
|
|
|
\subsection{script}\label{script}\index{script=\texttt{script}|(textbf}
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
2001-07-02 15:32:33 +00:00
|
|
|
|
Dieses Kommando eignet sich vorz<72>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<73>hren kann. Wenn man fertig ist,
|
2001-07-02 16:53:41 +00:00
|
|
|
|
beendet man den script-Befehl durch die Eingabe von \texttt{exit},
|
|
|
|
|
\texttt{logout} oder Druck der Tastenkombination \Ovalbox{CTRL}+\Ovalbox{d}
|
|
|
|
|
(EOF).
|
2001-07-02 15:32:33 +00:00
|
|
|
|
|
|
|
|
|
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.
|
2001-07-02 12:52:18 +00:00
|
|
|
|
|
|
|
|
|
\subsection{seq}
|
|
|
|
|
|
|
|
|
|
TODO!!!
|
|
|
|
|
|
|
|
|
|
\subsection{expr}
|
|
|
|
|
|
|
|
|
|
TODO!!!
|
|
|
|
|
|
|
|
|
|
\subsection{bc}
|
|
|
|
|
|
|
|
|
|
TODO!!!
|
|
|
|
|
|
|
|
|
|
\subsection{kill}
|
|
|
|
|
|
|
|
|
|
TODO!!!
|
|
|
|
|
|
|
|
|
|
\subsection{sleep}
|
|
|
|
|
|
|
|
|
|
TODO!!!
|
|
|
|
|
|
|
|
|
|
\subsection{who}
|
|
|
|
|
|
|
|
|
|
TODO!!!
|