Struktur umgestellt

This commit is contained in:
rschaten
2004-10-28 15:44:41 +00:00
parent b7c54658b2
commit c6e06f8072

View File

@ -28,30 +28,97 @@ werden. F
Man-Pages oder der Kauf eines entsprechenden Buches. Am besten macht man
nat<EFBFBD>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<41>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<75>chst
typische Aufgaben beschrieben. Diese enthalten 'Links' zu den in Frage
kommenden Werkzeugen. Danach gibt es eine alphabetische Aufz<66>hlung der
wichtigsten Kommandos.
\section{N<EFBFBD>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<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}
\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<61>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 <20>ber Befehlsformen
(\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, da<64> 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<70>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<EFBFBD>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
<EFBFBD>bergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name
der eigentlichen Datei wird zur<75>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<50>w<EFBFBD>rter f<>r neue Benutzer zu vergeben. Manuell <20>ndert man
ein Pa<50>wort mit dem Kommando \texttt{passwd}\index{passwd=\texttt{passwd}},
allerdings l<>scht (flusht) dieses Programm die Standard-Eingabe, bevor es das
neue Pa<50>wort erwartet. Somit lassen sich Pa<50>w<EFBFBD>rter mit \texttt{passwd} nur
interaktiv <20>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<65>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<EFBFBD>wort-Kombinationen an die Standard-Eingabe zu <20>bergeben:
\texttt{cat }\textit{passwoerter.txt}\texttt{ | chpasswd}
Allerdings sollte dabei aus Sicherheitsgr<67>nden darauf geachtet werden, da<64>
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<75>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<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}
\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<75>rer
Ausdr<EFBFBD>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<73><74>t fast jeder Shell-Skripter fr<66>her oder sp<73>ter auf
das Problem, da<64> er irgendwas davon abh<62>ngig machen will, ob ein bestimmter
Proze<EFBFBD> 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<EFBFBD>uft
schon}\texttt{\dq}
Der Grund daf<61>r ist, da<64> unter Umst<73>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<EFBFBD>uft schon}\texttt{\dq}
Das p ist jetzt als eine Zeichenmenge (regul<75>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<61>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<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,
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
<EFBFBD>bergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name
der eigentlichen Datei wird zur<75>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<75>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<65>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 <20>ber Befehlsformen
(\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, da<64> 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<70>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<75>rer
Ausdr<EFBFBD>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<73><74>t fast jeder Shell-Skripter fr<66>her oder sp<73>ter auf
das Problem, da<64> er irgendwas davon abh<62>ngig machen will, ob ein bestimmter
Proze<EFBFBD> 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<EFBFBD>uft
schon}\texttt{\dq}
Der Grund daf<61>r ist, da<64> unter Umst<73>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<EFBFBD>uft schon}\texttt{\dq}
Das p ist jetzt als eine Zeichenmenge (regul<75>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<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,
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<50>w<EFBFBD>rter f<>r neue Benutzer zu vergeben. Manuell <20>ndert man
ein Pa<50>wort mit dem Kommando \texttt{passwd}\index{passwd=\texttt{passwd}},
allerdings l<>scht (flusht) dieses Programm die Standard-Eingabe, bevor es das
neue Pa<50>wort erwartet. Somit lassen sich Pa<50>w<EFBFBD>rter mit \texttt{passwd} nur
interaktiv <20>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<EFBFBD>wort-Kombinationen an die Standard-Eingabe zu <20>bergeben:
\texttt{cat }\textit{passwoerter.txt}\texttt{ | chpasswd}
Allerdings sollte dabei aus Sicherheitsgr<67>nden darauf geachtet werden, da<64>
diese Datei nicht allgemein lesbar ist.
\index{chpasswd=\texttt{chpasswd}|)}