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 Man-Pages oder der Kauf eines entsprechenden Buches. Am besten macht man
nat<EFBFBD>rlich beides. ;-) 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 Beinahe jedes Skript verwendet in irgendeiner Form die Ein- oder Ausgabe. Sei
es in interaktiver Art auf dem Terminal, oder im Hintergrund auf Dateien. es in interaktiver Art auf dem Terminal, oder im Hintergrund auf Dateien.
Einige grundlegende Kommandos in diesem Zusammenhang werden hier vorgestellt. Einige grundlegende Kommandos in diesem Zusammenhang werden hier vorgestellt.
\subsection{echo}\label{echo}\index{echo=\texttt{echo}|(textbf} cat
echo
Dies ist wohl der grundlegendste Befehl, der in einem Skript verwendet werden head
kann. Er ist die Voraussetzung, um eines der wichtigsten Werkzeuge der printf
Kybernetik auch mittels eines Shell-Skriptes effizient umzusetzen: Hello World. read
:-) tail
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{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!!! TODO!!!
@ -80,17 +147,96 @@ werden.
\index{cat=\texttt{cat}|)} \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 Mit diesem Kommando bietet sich dem Administrator des Systems die M<>glichkeit,
kein Dateiname (oder ein \texttt{-}) angegeben wird, liest \texttt{tail} von scriptgesteuert die Pa<50>w<EFBFBD>rter f<>r neue Benutzer zu vergeben. Manuell <20>ndert man
der Standard-Eingabe. Man kann die Anzahl der ausgegebenen Zeilen mit dem ein Pa<50>wort mit dem Kommando \texttt{passwd}\index{passwd=\texttt{passwd}},
Parameter \texttt{-l} steuern. 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, Das Kommando wird in der Form
sobald sie an die Datei angeh<65>ngt werden.
\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} \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}|)} \index{head=\texttt{head}|)}
\subsection{kill}
TODO!!!
\subsection{printf}
TODO!!!
\subsection{read}\label{read}\index{read=\texttt{read}|(textbf} \subsection{read}\label{read}\index{read=\texttt{read}|(textbf}
Mit dem Kommando \texttt{read} kann man Eingaben von der Mit dem Kommando \texttt{read} kann man Eingaben von der
@ -152,28 +308,57 @@ Timeout oder ein EOF auf.
\index{read=\texttt{read}|)} \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 Dieses Kommando eignet sich vorz<72>glich f<>r das Debuggen fertiger Skripte. Man
Dateien. In diesem Abschnitt geht es allerdings nicht um den Umgang mit ruft es in Verbindung mit einem Dateinamen auf. Dieser Aufruf startet eine neue
Dateiinhalten, sondern vielmehr werden einige n<>tzliche Tools im Umgang mit Shell, in der man beliebige Kommandos ausf<73>hren kann. Wenn man fertig ist,
Dateien an sich vorgestellt. 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} Script schreibt alle Ein- und Ausgaben die an dem Terminal vorgenommen werden
in die angegebene Datei. So kann man auch interaktive Skripte relativ leicht
Dem Tool \texttt{basename} wird als Parameter ein Pfad zu einer Datei debuggen, da sowohl Ein- als auch Ausgaben in dem Logfile sichtbar sind.
<EFBFBD>bergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name \index{script=\texttt{script}|)}
der eigentlichen Datei wird zur<75>ckgegeben.
\index{basename=\texttt{basename}|)}
\subsection{dirname}\label{dirname}\index{dirname=\texttt{dirname}|(textbf} \subsection{sed}
Analog zu \texttt{basename} gibt \texttt{dirname} nur die Pfad-Komponente einer TODO!!!
angegebenen Datei zur<75>ck.
\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} \subsection{touch}\label{touch}\index{touch=\texttt{touch}|(textbf}
@ -195,144 +380,11 @@ Referenzdatei angepa
\index{touch=\texttt{touch}|)} \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} \subsection{wc}
TODO!!! 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} \subsection{who}
TODO!!! 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}|)}