diff --git a/werkzeugkasten.tex b/werkzeugkasten.tex index d0147a3..187dc70 100644 --- a/werkzeugkasten.tex +++ b/werkzeugkasten.tex @@ -28,30 +28,97 @@ werden. F Man-Pages oder der Kauf eines entsprechenden Buches. Am besten macht man natürlich beides. ;-) -\section{Ein- und Ausgabe}\label{ein_und_ausgabe} +Eine globale Beschreibung aller gängigen Kommandos würde den Rahmen dieses +Textes sprengen. Außerdem wäre es nicht leicht, das zu einer Aufgabe passende +Werkzeug zu finden. Die Werkzeuge nach Aufgaben zu sortieren fällt allerdings +auch nicht leicht. Die Entwickler der Kommandos versuchen, ihre Tools möglichst +universell einsetzbar zu halten, also gibt es keine 1:1-Beziehung zwischen +Problem und Lösung. + +Um sowohl das Finden eines Werkzeugs zu einem gegebenen Problem als auch das +Finden einer Beschreibung zu einem gegebenen Werkzeug zu vereinfachen, und um +die oben beschriebene n:m-Beziehung abzubilden, werden hier also zunächst +typische Aufgaben beschrieben. Diese enthalten 'Links' zu den in Frage +kommenden Werkzeugen. Danach gibt es eine alphabetische Aufzählung der +wichtigsten Kommandos. + +\section{Nägel...}\label{naegel} + +\subsection{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} - -\index{echo=\texttt{echo}|)} +cat +echo +head +printf +read +tail -\subsection{printf} +\subsection{Pfade und Dateien}\label{pfade_und_dateien} + +Eine der Hautaufgaben von Shell-Skripten ist natürlich das Hantieren mit +Dateien. In diesem Abschnitt geht es allerdings nicht um den Umgang mit +Dateiinhalten, sondern vielmehr werden einige nützliche Tools im Umgang mit +Dateien an sich vorgestellt. + +basename +dirname +touch + + +\subsection{Pipes manipulieren}\label{pipes_manipulieren}\index{Pipe|(textbf} + +Das Konzept der Pipes (Röhren) wird bereits in dem Kapitel über Befehlsformen +(\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, daß Daten +von einem Programm an ein anderes weitergeleitet werden. Auf diese Weise +entsteht eine sogenannte \textit{Pipeline}\index{Pipeline} aus mehreren +Kommandos. + +Einige Kommandos sind für den Einsatz in einem solchen Konstrukt prädestiniert, +obwohl die meisten auch alleine eingesetzt werden können. Einige dieser +Tools sollen im Folgenden vorgestellt werden. + +grep +sed +awk +sort +tee +wc +\index{Pipe|)} + + +\subsection{Prozeßmanagement}\label{prozessmanagement} + +TODO!! + +ps +pgrep +pkill +kill + + +\section{... und Hämmer}\label{haemmer} + + +\subsection{awk} + +TODO!! + + +\subsection{basename}\label{basename}\index{basename=\texttt{basename}|(textbf} + +Dem Tool \texttt{basename} wird als Parameter ein Pfad zu einer Datei +übergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name +der eigentlichen Datei wird zurückgegeben. + +\index{basename=\texttt{basename}|)} + + +\subsection{bc} TODO!!! @@ -80,17 +147,96 @@ werden. \index{cat=\texttt{cat}|)} -\subsection{tail}\label{tail}\index{tail=\texttt{tail}|(textbf} +\subsection{chpasswd}\label{script}\index{chpasswd=\texttt{chpasswd}|(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 diesem Kommando bietet sich dem Administrator des Systems die Möglichkeit, +scriptgesteuert die Paßwörter für neue Benutzer zu vergeben. Manuell ändert man +ein Paßwort mit dem Kommando \texttt{passwd}\index{passwd=\texttt{passwd}}, +allerdings löscht (flusht) dieses Programm die Standard-Eingabe, bevor es das +neue Paßwort erwartet. Somit lassen sich Paßwörter mit \texttt{passwd} nur +interaktiv ändern\footnote{Es gibt auch einen anderen Weg: Man kann +\texttt{passwd} auch mittels \texttt{expect} fernsteuern. Allerdings ist diese +Methode weniger elegant.}. -Mit dem Parameter \texttt{-f} (follow) gibt \texttt{tail} neue Zeilen aus, -sobald sie an die Datei angehängt werden. +Das Kommando wird in der Form -\index{tail=\texttt{tail}|)} +\texttt{echo }\textit{name}\texttt{:}\textit{pass}\texttt{ | chpasswd} + +aufgerufen. Es ist auch möglich, dem Programm eine Datei mit vielen Name / +Paßwort-Kombinationen an die Standard-Eingabe zu übergeben: + +\texttt{cat }\textit{passwoerter.txt}\texttt{ | chpasswd} + +Allerdings sollte dabei aus Sicherheitsgründen darauf geachtet werden, daß +diese Datei nicht allgemein lesbar ist. + +\index{chpasswd=\texttt{chpasswd}|)} +\subsection{dirname}\label{dirname}\index{dirname=\texttt{dirname}|(textbf} + +Analog zu \texttt{basename} gibt \texttt{dirname} nur die Pfad-Komponente einer +angegebenen Datei zurück. + +\index{dirname=\texttt{dirname}|)} + + +\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} + +\index{echo=\texttt{echo}|)} + + +\subsection{expr} + +TODO!!! + + +\subsection{grep}\label{grep}\index{grep=\texttt{grep}|(textbf} + +Das Tool \texttt{grep} stammt aus dem Standard-Repertoire eines jeden +Systemadministrators. Mit seiner Hilfe kann in einer oder mehreren Dateien, +oder eben auch in einem Datenstrom nach dem Auftreten bestimmter regulärer +Ausdrücke (siehe \ref{mustererkennung}) gesucht werden. + +TODO!!! + +Die folgende Tabelle stellt einige der vielen Parameter vor: + +\LTXtable{\textwidth}{tab_kommandos_grep_parameter.tex} + +Im Zusammenhang mit grep stößt fast jeder Shell-Skripter früher oder später auf +das Problem, daß er irgendwas davon abhängig machen will, ob ein bestimmter +Prozeß läuft oder nicht. Im Normalfall wird er zuerst folgendes ausprobieren, +was aber oft (nicht immer) in die Hose gehen wird: + +\texttt{ps aux | grep }\textit{prozessname}\texttt{ \&\& echo \dq}\textit{läuft +schon}\texttt{\dq} + +Der Grund dafür ist, daß unter Umständen in der Ausgabe von \texttt{ps} auch +das \texttt{grep}-Kommando samt Parameter (\textit{prozessname}) aufgelistet +wird. So findet das \texttt{grep}-Kommando sich quasi selbst. + +Abhilfe schafft das folgende Konstrukt: + +\texttt{ps aux | grep \dq}\textit{[p]rozessname}\texttt{\dq~\&\& echo +\dq}\textit{läuft schon}\texttt{\dq} + +Das p ist jetzt als eine Zeichenmenge (regulärer Ausdruck) angegeben worden. +Jetzt sucht \texttt{grep} also nach dem String \textit{prozessname}, in der +Ausgabe von \texttt{ps} erscheint das \texttt{grep}-Kommando allerdings mit +\textit{[p]rozessname} und wird somit ignoriert. + +\index{grep=\texttt{grep}|)} \subsection{head}\label{head}\index{head=\texttt{head}|(textbf} @@ -101,6 +247,16 @@ werden allerdings nicht die letzten Zeilen angezeigt, sondern die ersten. \index{head=\texttt{head}|)} +\subsection{kill} + +TODO!!! + + +\subsection{printf} + +TODO!!! + + \subsection{read}\label{read}\index{read=\texttt{read}|(textbf} Mit dem Kommando \texttt{read} kann man Eingaben von der @@ -152,28 +308,57 @@ Timeout oder ein EOF auf. \index{read=\texttt{read}|)} -\section{Pfade und Dateien}\label{pfade_und_dateien} +\subsection{script}\label{script}\index{script=\texttt{script}|(textbf} -Eine der Hautaufgaben von Shell-Skripten ist natürlich das Hantieren mit -Dateien. In diesem Abschnitt geht es allerdings nicht um den Umgang mit -Dateiinhalten, sondern vielmehr werden einige nützliche Tools im Umgang mit -Dateien an sich vorgestellt. +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). -\subsection{basename}\label{basename}\index{basename=\texttt{basename}|(textbf} - -Dem Tool \texttt{basename} wird als Parameter ein Pfad zu einer Datei -übergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name -der eigentlichen Datei wird zurückgegeben. - -\index{basename=\texttt{basename}|)} +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. +\index{script=\texttt{script}|)} -\subsection{dirname}\label{dirname}\index{dirname=\texttt{dirname}|(textbf} +\subsection{sed} -Analog zu \texttt{basename} gibt \texttt{dirname} nur die Pfad-Komponente einer -angegebenen Datei zurück. +TODO!!! -\index{dirname=\texttt{dirname}|)} + +\subsection{seq} + +TODO!!! + + +\subsection{sleep} + +TODO!!! + + +\subsection{sort} + +TODO!!! + + +\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. + +\index{tail=\texttt{tail}|)} + + +\subsection{tee} + +TODO!!! \subsection{touch}\label{touch}\index{touch=\texttt{touch}|(textbf} @@ -195,144 +380,11 @@ Referenzdatei angepa \index{touch=\texttt{touch}|)} -\section{Pipes manipulieren}\label{pipes_manipulieren}\index{Pipe|(textbf} - -Das Konzept der Pipes (Röhren) wird bereits in dem Kapitel über Befehlsformen -(\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, daß Daten -von einem Programm an ein anderes weitergeleitet werden. Auf diese Weise -entsteht eine sogenannte \textit{Pipeline}\index{Pipeline} aus mehreren -Kommandos. - -Einige Kommandos sind für den Einsatz in einem solchen Konstrukt prädestiniert, -obwohl die meisten auch alleine eingesetzt werden können. Einige dieser -Tools sollen im Folgenden vorgestellt werden. - -\subsection{grep}\label{grep}\index{grep=\texttt{grep}|(textbf} - -Das Tool \texttt{grep} stammt aus dem Standard-Repertoire eines jeden -Systemadministrators. Mit seiner Hilfe kann in einer oder mehreren Dateien, -oder eben auch in einem Datenstrom nach dem Auftreten bestimmter regulärer -Ausdrücke (siehe \ref{mustererkennung}) gesucht werden. - -TODO!!! - -Die folgende Tabelle stellt einige der vielen Parameter vor: - -\LTXtable{\textwidth}{tab_kommandos_grep_parameter.tex} - -Im Zusammenhang mit grep stößt fast jeder Shell-Skripter früher oder später auf -das Problem, daß er irgendwas davon abhängig machen will, ob ein bestimmter -Prozeß läuft oder nicht. Im Normalfall wird er zuerst folgendes ausprobieren, -was aber oft (nicht immer) in die Hose gehen wird: - -\texttt{ps aux | grep }\textit{prozessname}\texttt{ \&\& echo \dq}\textit{läuft -schon}\texttt{\dq} - -Der Grund dafür ist, daß unter Umständen in der Ausgabe von \texttt{ps} auch -das \texttt{grep}-Kommando samt Parameter (\textit{prozessname}) aufgelistet -wird. So findet das \texttt{grep}-Kommando sich quasi selbst. - -Abhilfe schafft das folgende Konstrukt: - -\texttt{ps aux | grep \dq}\textit{[p]rozessname}\texttt{\dq~\&\& echo -\dq}\textit{läuft schon}\texttt{\dq} - -Das p ist jetzt als eine Zeichenmenge (regulärer Ausdruck) angegeben worden. -Jetzt sucht \texttt{grep} also nach dem String \textit{prozessname}, in der -Ausgabe von \texttt{ps} erscheint das \texttt{grep}-Kommando allerdings mit -\textit{[p]rozessname} und wird somit ignoriert. - -\index{grep=\texttt{grep}|)} - - -\subsection{sed} - -TODO!!! - - -\subsection{awk} - -TODO!! - -\subsection{sort} - -TODO!!! - -\subsection{tee} - -TODO!!! - \subsection{wc} TODO!!! -\index{Pipe|)} - - -\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. -\index{script=\texttt{script}|)} - -\subsection{seq} - -TODO!!! - -\subsection{expr} - -TODO!!! - -\subsection{bc} - -TODO!!! - -\subsection{kill} - -TODO!!! - -\subsection{sleep} - -TODO!!! \subsection{who} TODO!!! - -\subsection{chpasswd}\label{script}\index{chpasswd=\texttt{chpasswd}|(textbf} - -Mit diesem Kommando bietet sich dem Administrator des Systems die Möglichkeit, -scriptgesteuert die Paßwörter für neue Benutzer zu vergeben. Manuell ändert man -ein Paßwort mit dem Kommando \texttt{passwd}\index{passwd=\texttt{passwd}}, -allerdings löscht (flusht) dieses Programm die Standard-Eingabe, bevor es das -neue Paßwort erwartet. Somit lassen sich Paßwörter mit \texttt{passwd} nur -interaktiv ändern\footnote{Es gibt auch einen anderen Weg: Man kann -\texttt{passwd} auch mittels \texttt{expect} fernsteuern. Allerdings ist diese -Methode weniger elegant.}. - -Das Kommando wird in der Form - -\texttt{echo }\textit{name}\texttt{:}\textit{pass}\texttt{ | chpasswd} - -aufgerufen. Es ist auch möglich, dem Programm eine Datei mit vielen Name / -Paßwort-Kombinationen an die Standard-Eingabe zu übergeben: - -\texttt{cat }\textit{passwoerter.txt}\texttt{ | chpasswd} - -Allerdings sollte dabei aus Sicherheitsgründen darauf geachtet werden, daß -diese Datei nicht allgemein lesbar ist. - -\index{chpasswd=\texttt{chpasswd}|)}