Grundlegende Ueberarbeitung
This commit is contained in:
parent
c6e06f8072
commit
7eea8ed0e9
@ -63,7 +63,8 @@ done
|
|||||||
echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen
|
echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen
|
||||||
\end{listing}
|
\end{listing}
|
||||||
\normalsize
|
\normalsize
|
||||||
TODO!!!
|
|
||||||
|
TODO!!! Daten aus Subshell hochreichen
|
||||||
|
|
||||||
Achtung! while ist eine Subshell - Daten müssen hochgereicht werden.
|
Achtung! while ist eine Subshell - Daten müssen hochgereicht werden.
|
||||||
|
|
||||||
@ -339,8 +340,7 @@ Wenn \texttt{case} eine andere Parameterzahl feststellt, wird eine Meldung mit d
|
|||||||
\index{trap=\texttt{trap}|)}\index{Signal|)}
|
\index{trap=\texttt{trap}|)}\index{Signal|)}
|
||||||
|
|
||||||
|
|
||||||
\section{Chaoten: Dateien in zufällige Reihenfolge
|
\section{Chaoten: Dateien in zufällige Reihenfolge bringen}\label{chaoten}\index{Zufallszahlen|(}
|
||||||
bringen}\label{chaoten}\index{Zufallszahlen|(}
|
|
||||||
|
|
||||||
Wir wollen uns einen MP3-Player programmieren, der Alle MP3-Dateien aus einem
|
Wir wollen uns einen MP3-Player programmieren, der Alle MP3-Dateien aus einem
|
||||||
bestimmten Verzeichnisbaum in zufälliger Reihenfolge abspielt. Damit dieses
|
bestimmten Verzeichnisbaum in zufälliger Reihenfolge abspielt. Damit dieses
|
||||||
@ -354,7 +354,7 @@ Das Problem ist, da
|
|||||||
können. Auf Systemen, in denen die Datei \texttt{/dev/urandom} existiert,
|
können. Auf Systemen, in denen die Datei \texttt{/dev/urandom} existiert,
|
||||||
liefert uns der Kernel aber schon sehr zufällige Zeichenfolgen. Diese Folgen
|
liefert uns der Kernel aber schon sehr zufällige Zeichenfolgen. Diese Folgen
|
||||||
können alle Zeichen enthalten, daher müssen sie vor der Benutzung für unsere
|
können alle Zeichen enthalten, daher müssen sie vor der Benutzung für unsere
|
||||||
Zwecke noch etwas 'bereinigt' werden.
|
Zwecke noch etwas `bereinigt' werden.
|
||||||
|
|
||||||
Wie das aussieht, wenn es fertig ist, sieht man im folgenden Skript:
|
Wie das aussieht, wenn es fertig ist, sieht man im folgenden Skript:
|
||||||
|
|
||||||
@ -379,13 +379,13 @@ ignorieren Gro
|
|||||||
\end{listingcont}
|
\end{listingcont}
|
||||||
\normalsize
|
\normalsize
|
||||||
\begin{flushright}
|
\begin{flushright}
|
||||||
Hier ist der 'magische Teil'. Mit dem \texttt{echo} wird die Ausgabe einer Pipe
|
Hier ist der `magische Teil'. Mit dem \texttt{echo} wird die Ausgabe einer Pipe
|
||||||
ausgegeben, gefolgt von dem aktuellen Dateinamen. Diese Pipe enthält ein
|
ausgegeben, gefolgt von dem aktuellen Dateinamen. Diese Pipe enthält ein
|
||||||
\texttt{tr}, der alle ungewollten Zeichen (alles, was kein Textzeichen ist) aus
|
\texttt{tr}, der alle ungewollten Zeichen (alles, was kein Textzeichen ist) aus
|
||||||
einem Datenstrom entfernt. Die Daten erhält \texttt{tr} durch die
|
einem Datenstrom entfernt. Die Daten erhält \texttt{tr} durch die
|
||||||
\texttt{<}-Umleitung aus oben genannter Datei.
|
\texttt{<}-Umleitung aus oben genannter Datei.
|
||||||
|
|
||||||
Diese Datei liefert 'ohne Ende' Zeichen. Wir wollen aber nur acht Zeichen
|
Diese Datei liefert `ohne Ende' Zeichen. Wir wollen aber nur acht Zeichen
|
||||||
haben, die wir unserem Dateinamen voranstellen können. Dazu benutzen wir das
|
haben, die wir unserem Dateinamen voranstellen können. Dazu benutzen wir das
|
||||||
Kommando \texttt{dd} mit den angegebenen Parametern. Damit die Erfolgsmeldung
|
Kommando \texttt{dd} mit den angegebenen Parametern. Damit die Erfolgsmeldung
|
||||||
von \texttt{dd} nicht die Ausgabe verunstaltet, lenken wir sie nach
|
von \texttt{dd} nicht die Ausgabe verunstaltet, lenken wir sie nach
|
||||||
@ -424,3 +424,79 @@ done
|
|||||||
\end{listingcont}
|
\end{listingcont}
|
||||||
\normalsize
|
\normalsize
|
||||||
\index{Zufallszahlen|)}
|
\index{Zufallszahlen|)}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\section{Wer suchet, der findet}\label{beispiele_suchen}\index{grep=\texttt{grep}|(textbf}
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Prozesse suchen}\label{beispiele_suchen_prozesse}\index{ps=\texttt{ps}|(textbf}\index{pgrep=\texttt{pgrep}|(textbf}
|
||||||
|
|
||||||
|
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 entweder \texttt{pgrep} (\ref{pgrep}) oder 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{ps=\texttt{ps}|)textbf}\index{pgrep=\texttt{pgrep}|)textbf}
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Dateiinhalte suchen}\label{beispiele_suchen_dateien}\index{find=\texttt{find}|(textbf}
|
||||||
|
|
||||||
|
Ein weiterer wertvoller Trick, diesmal im Zusammenhang mit \texttt{find} ist
|
||||||
|
folgendes Szenario: Es gibt ein Verzeichnis mit vielen Unterverzeichnissen,
|
||||||
|
überall liegen Perl-Skripte und andere Dateien. Gesucht sind alle Dateien, in
|
||||||
|
denen eine Zeile mit dem Inhalt `strict' vorkommt. Man könnte jetzt
|
||||||
|
folgendes versuchen:
|
||||||
|
|
||||||
|
\texttt{grep -r strict *}
|
||||||
|
|
||||||
|
Das führt allerdings dazu, daß alle Dateien durchsucht werden, nicht nur die
|
||||||
|
Perl-Skripte. Diese tragen nach unserer Konvention\footnote{Perl-Skripte müssen
|
||||||
|
keine spezielle Extension haben, es sei aber um des Beispiels Willen mal
|
||||||
|
angenommen.} die Extension `.pl'. Wir starten also eine rekursive Suche über
|
||||||
|
alle Dateien, die dem Muster entsprechen:
|
||||||
|
|
||||||
|
\texttt{grep -r strict *.pl}
|
||||||
|
|
||||||
|
Das führt wieder nicht zu dem gewünschten Ergebnis. Da die Unterverzeichnisse
|
||||||
|
nicht die Extension `*.pl' tragen, werden sie nicht berücksichtigt. Für die
|
||||||
|
Suche in Unterverzeichnissen ziehen wir \texttt{find} (Siehe Abschnitt
|
||||||
|
\ref{find}) heran:
|
||||||
|
|
||||||
|
\texttt{find . -name \textbackslash*.pl -exec grep \{\} \textbackslash;}
|
||||||
|
|
||||||
|
Dieser Befehl gibt uns zwar die gefundenen Zeilen aus, nicht aber die Namen der
|
||||||
|
Dateien. Es sieht für \texttt{grep} so aus als ob nur eine Datei durchsucht
|
||||||
|
würde, da besteht keine Notwendigkeit den Namen anzugeben. Das ginge mit dem
|
||||||
|
Parameter \texttt{-l}, allerdings würden uns dann nur noch die Dateinamen
|
||||||
|
angezeigt. Eine Ausgabe mit beiden Informationen erhalten wir mit dem folgenden
|
||||||
|
Konstrukt:
|
||||||
|
|
||||||
|
\texttt{find . -name \textbackslash*.pl -exec grep strict /dev/null \{\} \textbackslash;}
|
||||||
|
|
||||||
|
Hier durchsucht \texttt{grep} nicht nur die gefundenen Dateien, sondern bei
|
||||||
|
jedem Aufruf auch \texttt{/dev/null}, also den digitalen Mülleimer der per
|
||||||
|
Definition leer ist. Da es für \texttt{grep} so aussieht als ob mehr als eine
|
||||||
|
Datei durchsucht würden, wird bei jeder Fundstelle sowohl der Dateiname als
|
||||||
|
auch die gefundene Zeile ausgegeben.
|
||||||
|
|
||||||
|
\index{find=\texttt{find}|)textbf}
|
||||||
|
\index{grep=\texttt{grep}|)textbf}
|
||||||
|
@ -8,6 +8,9 @@
|
|||||||
\item Unix In A Nutshell (\texttt{http://www.oreilly.com/catalog/unixnut3/})
|
\item Unix In A Nutshell (\texttt{http://www.oreilly.com/catalog/unixnut3/})
|
||||||
\item Unix Power Tools (\texttt{http://www.oreilly.com/catalog/upt2/})
|
\item Unix Power Tools (\texttt{http://www.oreilly.com/catalog/upt2/})
|
||||||
\item Von DOS nach Linux HOWTO (\texttt{http://www.linuxhaven.de/dlhp/HOWTO/DE-DOS-nach-Linux-HOWTO.html})
|
\item Von DOS nach Linux HOWTO (\texttt{http://www.linuxhaven.de/dlhp/HOWTO/DE-DOS-nach-Linux-HOWTO.html})
|
||||||
|
|
||||||
|
TODO!!! Andere URL angeben (http://www.tldp.org...)
|
||||||
|
|
||||||
\item ... und eine Menge Skripte, die ich im Laufe der Zeit gelesen habe (das
|
\item ... und eine Menge Skripte, die ich im Laufe der Zeit gelesen habe (das
|
||||||
kann ich nur jedem empfehlen - es ist spannender als es sich anhört...).
|
kann ich nur jedem empfehlen - es ist spannender als es sich anhört...).
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
@ -24,28 +24,28 @@ haben.
|
|||||||
|
|
||||||
\section{Die Tar-Brücke}
|
\section{Die Tar-Brücke}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! tar-Brücke
|
||||||
|
|
||||||
|
|
||||||
\section{Binaries inside}
|
\section{Binaries inside}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! binaries inside
|
||||||
|
|
||||||
\subsection{Binäre Here-Dokumente}
|
\subsection{Binäre Here-Dokumente}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! binäre Here-Dokumente
|
||||||
|
|
||||||
\subsection{Schwanz ab!}
|
\subsection{Schwanz ab!}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! Schwanz ab
|
||||||
|
|
||||||
\section{Dateien, die es nicht gibt}
|
\section{Dateien, die es nicht gibt}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! Dateien, die es nicht gibt
|
||||||
|
|
||||||
\subsection{Speichern in nicht existente Dateien}
|
\subsection{Speichern in nicht existente Dateien}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! Speichern in nicht existente Dateien
|
||||||
|
|
||||||
\subsection{Subshell-Schleifen vermeiden}
|
\subsection{Subshell-Schleifen vermeiden}
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ nach der Vollendung der Schleife wieder den Wert 0 enth
|
|||||||
Das liegt daran, daß diese Schleife als Teil einer Pipe in einer Subshell
|
Das liegt daran, daß diese Schleife als Teil einer Pipe in einer Subshell
|
||||||
ausgeführt wird. Die Variable \texttt{\$count} steht damit in der Schleife
|
ausgeführt wird. Die Variable \texttt{\$count} steht damit in der Schleife
|
||||||
praktisch nur lokal zur Verfügung, sie wird nicht an das umgebende Skript
|
praktisch nur lokal zur Verfügung, sie wird nicht an das umgebende Skript
|
||||||
'hochgereicht'.
|
`hochgereicht'.
|
||||||
|
|
||||||
Neben der Methode in \ref{daten_hochreichen} bietet sich hier eine viel
|
Neben der Methode in \ref{daten_hochreichen} bietet sich hier eine viel
|
||||||
einfachere Lösung an:
|
einfachere Lösung an:
|
||||||
@ -110,7 +110,7 @@ Standardeingabe der Schleife (und somit auf das \texttt{read}-Kommando) legen.
|
|||||||
|
|
||||||
\subsection{Daten aus einer Subshell hochreichen}\label{daten_hochreichen}
|
\subsection{Daten aus einer Subshell hochreichen}\label{daten_hochreichen}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! Daten aus einer Subshell hochreichen
|
||||||
|
|
||||||
\subsection{Dateien gleichzeitig lesen und schreiben}
|
\subsection{Dateien gleichzeitig lesen und schreiben}
|
||||||
|
|
||||||
@ -145,3 +145,8 @@ grep "wichtig" <&3 > "$FILE"
|
|||||||
|
|
||||||
Allerdings sollte man bei dieser Methode beachten, daß man im Falle eines
|
Allerdings sollte man bei dieser Methode beachten, daß man im Falle eines
|
||||||
Fehlers die Quelldaten verliert, da die Datei ja bereits gelöscht wurde.
|
Fehlers die Quelldaten verliert, da die Datei ja bereits gelöscht wurde.
|
||||||
|
|
||||||
|
\section{Auf der Lauer: Wachhunde}
|
||||||
|
|
||||||
|
TODO!!! Auf der Lauer: Wachhunde
|
||||||
|
|
||||||
|
27
shell.tex
27
shell.tex
@ -104,15 +104,28 @@
|
|||||||
\thispagestyle{empty} % eine Leerseite
|
\thispagestyle{empty} % eine Leerseite
|
||||||
~\vfill
|
~\vfill
|
||||||
\footnotesize
|
\footnotesize
|
||||||
Copyright \copyright{} 2000-2003 Ronald Schaten (\texttt{ronald@schatenseite.de})\bigskip
|
Copyright \copyright{} 2000-2004 Ronald Schaten (\texttt{ronald@schatenseite.de})\bigskip
|
||||||
|
|
||||||
\texttt{${}$Id${}$}\bigskip
|
TODO: Vernünftige Lizenz einsetzen!\bigskip
|
||||||
|
|
||||||
Die aktuellste Version dieses Dokumentes befindet sich im World Wide Web auf meiner Homepage (\texttt{http://www.schatenseite.de/}).\bigskip
|
%\texttt{${}$Id${}$}\bigskip
|
||||||
|
|
||||||
Dieses Dokument ist entstanden, weil ich für mich selbst eine kompakte Übersicht zu diesem Thema haben wollte. Ich beabsichtige nicht, damit in irgendeiner Form Kommerz zu machen. Ich stelle es frei zur Verfügung, in der Hoffnung, daß andere Leute daraus vielleicht einen Nutzen ziehen können. \textbf{Aber ich übernehme keine Garantie für die Korrektheit der hier dargestellten Dinge.} Mit der Formulierung \textsl{'daraus vielleicht einen Nutzen ziehen können'} meine ich nicht, daß dieses Dokument~---~oder Teile daraus~---~verkauft werden darf. \textbf{Dieses Dokument darf nur kostenlos weitergegeben werden.}\bigskip
|
Die aktuellste Version dieses Dokumentes befindet sich im World Wide Web auf
|
||||||
|
meiner Homepage (\texttt{http://www.schatenseite.de/}).\bigskip
|
||||||
|
|
||||||
Ich danke folgenden Personen, die mir bei der Durchsicht behilflich waren und durch ihre konstruktive Kritik zu Verbesserungen beigetragen haben (in chronologischer Reihenfolge ihres Eingreifens):
|
Dieses Dokument ist entstanden, weil ich für mich selbst eine kompakte
|
||||||
|
Übersicht zu diesem Thema haben wollte. Ich beabsichtige nicht, damit in
|
||||||
|
irgendeiner Form Kommerz zu machen. Ich stelle es frei zur Verfügung, in der
|
||||||
|
Hoffnung, daß andere Leute daraus vielleicht einen Nutzen ziehen können.
|
||||||
|
\textbf{Aber ich übernehme keine Garantie für die Korrektheit der hier
|
||||||
|
dargestellten Dinge.} Mit der Formulierung \textsl{`daraus vielleicht einen
|
||||||
|
Nutzen ziehen können'} meine ich nicht, daß dieses Dokument~---~oder Teile
|
||||||
|
daraus~---~verkauft werden darf. \textbf{Dieses Dokument darf nur kostenlos
|
||||||
|
weitergegeben werden.}\bigskip
|
||||||
|
|
||||||
|
Ich danke folgenden Personen, die mir bei der Durchsicht behilflich waren und
|
||||||
|
durch ihre konstruktive Kritik zu Verbesserungen beigetragen haben (in
|
||||||
|
chronologischer Reihenfolge ihres Eingreifens):
|
||||||
|
|
||||||
\begin{list}{$\bullet$}{\itemsep=-0.5cm}
|
\begin{list}{$\bullet$}{\itemsep=-0.5cm}
|
||||||
\item Jürgen Ilse (\texttt{ilse@asys-h.de})\\
|
\item Jürgen Ilse (\texttt{ilse@asys-h.de})\\
|
||||||
@ -123,7 +136,9 @@ Ich danke folgenden Personen, die mir bei der Durchsicht behilflich waren und du
|
|||||||
\item Kai Thöne (\texttt{kai.thoene@gmx.de})\\
|
\item Kai Thöne (\texttt{kai.thoene@gmx.de})\\
|
||||||
\end{list}
|
\end{list}
|
||||||
|
|
||||||
Und ich bitte alle Leser, auf eventuelle Fehler zu achten und mich darauf aufmerksam zu machen. Auch abgesehen davon freue ich mich über jede Rückmeldung.
|
Und ich bitte alle Leser, auf eventuelle Fehler zu achten und mich darauf
|
||||||
|
aufmerksam zu machen. Auch abgesehen davon freue ich mich über jede
|
||||||
|
Rückmeldung.
|
||||||
\normalsize
|
\normalsize
|
||||||
\newpage
|
\newpage
|
||||||
\pagenumbering{roman}
|
\pagenumbering{roman}
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
\texttt{\{ }\textsl{Befehl1}\texttt{ ; }\textsl{Befehl2}\texttt{; \}} & Befehlsblock; alle Befehle werden in der momentanen Shell ausgeführt, aber die Ausgaben werden behandelt, als ob nur ein Befehl ausgeführt würde \tabularnewline\STRUT
|
\texttt{\{ }\textsl{Befehl1}\texttt{ ; }\textsl{Befehl2}\texttt{; \}} & Befehlsblock; alle Befehle werden in der momentanen Shell ausgeführt, aber die Ausgaben werden behandelt, als ob nur ein Befehl ausgeführt würde \tabularnewline\STRUT
|
||||||
\textsl{Befehl1}\texttt{ | }\textsl{Befehl2} & Pipe\index{Pipe}, verwendet die Ausgabe von \textsl{Befehl1} als Eingabe für \textsl{Befehl2} \tabularnewline\STRUT
|
\textsl{Befehl1}\texttt{ | }\textsl{Befehl2} & Pipe\index{Pipe}, verwendet die Ausgabe von \textsl{Befehl1} als Eingabe für \textsl{Befehl2} \tabularnewline\STRUT
|
||||||
\textsl{Befehl1}\texttt{ `}\textsl{Befehl2}\texttt{`} & Befehls-Substitution, verwendet die Ausgabe von \textsl{Befehl2} als Argumente\index{Parameter}\index{Argument|see{Parameter}} für \textsl{Befehl1} \tabularnewline\STRUT
|
\textsl{Befehl1}\texttt{ `}\textsl{Befehl2}\texttt{`} & Befehls-Substitution, verwendet die Ausgabe von \textsl{Befehl2} als Argumente\index{Parameter}\index{Argument|see{Parameter}} für \textsl{Befehl1} \tabularnewline\STRUT
|
||||||
|
\textsl{Befehl1}\texttt{ \$(}\textsl{Befehl2}\texttt{)} & Befehls-Substitution, andere Schreibweise\tabularnewline\STRUT
|
||||||
\textsl{Befehl1}\texttt{ \&\& }\textsl{Befehl2} & AND\index{AND}, führt zuerst \textsl{Befehl1} und dann (wenn \textsl{Befehl1} erfolgreich war) \textsl{Befehl2} aus\footnote{Einen ähnlichen Mechanismus kennt man aus verschiedenen Programmiersprachen unter dem Begriff \textsl{Kurzschlußauswertung}\index{Kurzschlußauswertung} bzw. \textsl{lazy evaluation}\index{Lazy Evaluation|see{Kurzschlußauswertung}}.} \tabularnewline\STRUT
|
\textsl{Befehl1}\texttt{ \&\& }\textsl{Befehl2} & AND\index{AND}, führt zuerst \textsl{Befehl1} und dann (wenn \textsl{Befehl1} erfolgreich war) \textsl{Befehl2} aus\footnote{Einen ähnlichen Mechanismus kennt man aus verschiedenen Programmiersprachen unter dem Begriff \textsl{Kurzschlußauswertung}\index{Kurzschlußauswertung} bzw. \textsl{lazy evaluation}\index{Lazy Evaluation|see{Kurzschlußauswertung}}.} \tabularnewline\STRUT
|
||||||
\textsl{Befehl1}\texttt{ || }\textsl{Befehl2} & OR\index{OR}, entweder \textsl{Befehl1} ausführen oder \textsl{Befehl2} (Wenn \textsl{Befehl1} nicht erfolgreich war)
|
\textsl{Befehl1}\texttt{ || }\textsl{Befehl2} & OR\index{OR}, entweder \textsl{Befehl1} ausführen oder \textsl{Befehl2} (Wenn \textsl{Befehl1} nicht erfolgreich war)
|
||||||
\end{longtable}
|
\end{longtable}
|
||||||
|
@ -8,14 +8,13 @@
|
|||||||
\hline
|
\hline
|
||||||
\endlastfoot
|
\endlastfoot
|
||||||
|
|
||||||
\texttt{-A} \textit{n} & Gibt \textit{n} Zeilen nach einer Fundstelle aus \tabularnewline\STRUT
|
\texttt{-E} & Benutzt erweiterte reguläre Ausdrücke \tabularnewline\STRUT
|
||||||
\texttt{-B} \textit{n} & Gibt \textit{n} Zeilen vor einer Fundstelle aus \tabularnewline\STRUT
|
\texttt{-F} & Der Suchbegriff wird nicht als regulärer Ausdruck, sondern als `fixed String' benutzt \tabularnewline\STRUT
|
||||||
\texttt{-C} & Gibt einen Kontext von zwei Zeilen vor und nach einer Fundstelle aus \tabularnewline\STRUT
|
|
||||||
\texttt{-}\textit{n} & Gibt einen Kontext von \textit{n} Zeilen vor und nach einer Fundstelle aus \tabularnewline\STRUT
|
|
||||||
\texttt{-c} & Gibt für jede durchsuchte Datei die Anzahl der Fundstellen aus \tabularnewline\STRUT
|
\texttt{-c} & Gibt für jede durchsuchte Datei die Anzahl der Fundstellen aus \tabularnewline\STRUT
|
||||||
\texttt{-h} & Unterdrückt die Angabe der Dateinamen \tabularnewline\STRUT
|
\texttt{-f} & Liest die Suchbegriffe Zeile für Zeile aus einer Textdatei \tabularnewline\STRUT
|
||||||
\texttt{-i} & Ignoriert die Unterscheidung zwischen Groß- und Kleinschreibung \tabularnewline\STRUT
|
\texttt{-i} & Ignoriert die Unterscheidung zwischen Groß- und Kleinschreibung \tabularnewline\STRUT
|
||||||
\texttt{-l} & Gibt nur die Dateinamen aus \tabularnewline\STRUT
|
\texttt{-l} & Gibt nur die Dateinamen aus \tabularnewline\STRUT
|
||||||
\texttt{-n} & Gibt zusätzlich die Zeilennummern der Fundstellen aus \tabularnewline\STRUT
|
\texttt{-n} & Gibt zusätzlich die Zeilennummern der Fundstellen aus \tabularnewline\STRUT
|
||||||
\texttt{-e} & PLATZHALTER - TODO!!!
|
\texttt{-q} & Gibt die Fundstellen nicht aus, am Exitcode ist zu erkennen ob etwas gefunden wurde \tabularnewline\STRUT
|
||||||
|
\texttt{-v} & Findet alle Zeilen, in denen das Suchmuster \emph{nicht} vorkommt
|
||||||
\end{longtable}
|
\end{longtable}
|
||||||
|
@ -38,7 +38,7 @@ Problem und L
|
|||||||
Um sowohl das Finden eines Werkzeugs zu einem gegebenen Problem als auch das
|
Um sowohl das Finden eines Werkzeugs zu einem gegebenen Problem als auch das
|
||||||
Finden einer Beschreibung zu einem gegebenen Werkzeug zu vereinfachen, und um
|
Finden einer Beschreibung zu einem gegebenen Werkzeug zu vereinfachen, und um
|
||||||
die oben beschriebene n:m-Beziehung abzubilden, werden hier also zunächst
|
die oben beschriebene n:m-Beziehung abzubilden, werden hier also zunächst
|
||||||
typische Aufgaben beschrieben. Diese enthalten 'Links' zu den in Frage
|
typische Aufgaben beschrieben. Diese enthalten `Links' zu den in Frage
|
||||||
kommenden Werkzeugen. Danach gibt es eine alphabetische Aufzählung der
|
kommenden Werkzeugen. Danach gibt es eine alphabetische Aufzählung der
|
||||||
wichtigsten Kommandos.
|
wichtigsten Kommandos.
|
||||||
|
|
||||||
@ -46,28 +46,52 @@ wichtigsten Kommandos.
|
|||||||
|
|
||||||
\subsection{Ein- und Ausgabe}\label{ein_und_ausgabe}
|
\subsection{Ein- und Ausgabe}\label{ein_und_ausgabe}
|
||||||
|
|
||||||
Beinahe jedes Skript verwendet in irgendeiner Form die Ein- oder Ausgabe. Sei
|
Praktisch 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.
|
|
||||||
|
|
||||||
cat
|
An dieser Stelle sei darauf hingewiesen, daß es auf unixoiden Systemen nicht
|
||||||
echo
|
nur Dateien im Sinne von `ein paar Kilobytes Daten, die irgendwo auf der
|
||||||
head
|
Festplatte rumliegen' gibt. Vielmehr findet man hier die Geräte des Rechners
|
||||||
printf
|
als Dateien unter /dev. Der Kernel selbst stellt Schnittstellen in Form von
|
||||||
read
|
virtuellen Dateien unter /proc (ab Kernel 2.6 auch unter /sys) zur Verfügung.
|
||||||
tail
|
Und Schlußendlich können Prozesse sich sogenannte Named Pipes\index{Named Pipe}
|
||||||
|
anlegen, in die sie schreiben oder aus denen sie lesen.
|
||||||
|
|
||||||
|
Diese Kommandos sind also universell nützlich, nicht nur im Zusammenhang mit
|
||||||
|
Dateien auf der Festplatte.
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \texttt{cat} (\ref{cat}): Dateien einlesen und ausgeben
|
||||||
|
\item \texttt{echo} (\ref{echo}): Daten ausgeben
|
||||||
|
\item \texttt{grep} (\ref{grep}): In Dateien suchen
|
||||||
|
\item \texttt{head} (\ref{head}): Dateianfang ausgeben
|
||||||
|
\item \texttt{printf} (\ref{printf}): formatierte Datenausgabe
|
||||||
|
\item \texttt{read} (\ref{read}): Zeilen einlesen
|
||||||
|
\item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren
|
||||||
|
\item \texttt{tail} (\ref{tail}): Dateiende ausgeben
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
\subsection{Pfade und Dateien}\label{pfade_und_dateien}
|
\subsection{Pfade und Dateien}\label{pfade_und_dateien}
|
||||||
|
|
||||||
Eine der Hautaufgaben von Shell-Skripten ist natürlich das Hantieren mit
|
Eine der Hauptaufgaben von Shell-Skripten ist natürlich das Hantieren mit
|
||||||
Dateien. In diesem Abschnitt geht es allerdings nicht um den Umgang mit
|
Dateien. In diesem Abschnitt geht es allerdings nicht um den Umgang mit
|
||||||
Dateiinhalten, sondern vielmehr werden einige nützliche Tools im Umgang mit
|
Dateiinhalten, sondern vielmehr werden einige nützliche Tools im Umgang mit
|
||||||
Dateien an sich vorgestellt.
|
Dateien an sich vorgestellt.
|
||||||
|
|
||||||
basename
|
Auch hier gilt natürlich der Hinweis aus Abschnitt \ref{ein_und_ausgabe}: Eine
|
||||||
dirname
|
Datei kann viel mehr sein als nur ein paar Daten im Filesystem.
|
||||||
touch
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \texttt{basename} (\ref{basename}): Den Namen einer Datei (ohne Pfad) ausgeben
|
||||||
|
\item \texttt{cp} (\ref{cp}): Dateien kopieren
|
||||||
|
\item \texttt{dirname} (\ref{dirname}): Den Pfad zu einer Datei (ohne den Namen) ausgeben
|
||||||
|
\item \texttt{find} (\ref{find}): Dateien suchen
|
||||||
|
\item \texttt{mv} (\ref{mv}): Dateien verschieben
|
||||||
|
\item \texttt{rm} (\ref{rm}): Dateien löschen
|
||||||
|
\item \texttt{touch} (\ref{touch}): Eine leere Datei anlegen, bzw. das Zugriffsdatum einer Datei ändern
|
||||||
|
\item \texttt{xargs} (\ref{xargs}): Ausgaben eines Kommandos als Parameter eines anderen Kommandos benutzen
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
\subsection{Pipes manipulieren}\label{pipes_manipulieren}\index{Pipe|(textbf}
|
\subsection{Pipes manipulieren}\label{pipes_manipulieren}\index{Pipe|(textbf}
|
||||||
@ -76,53 +100,93 @@ Das Konzept der Pipes (R
|
|||||||
(\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, daß Daten
|
(\ref{befehlsformen}) vorgestellt. Im wesentlichen besteht es darin, daß Daten
|
||||||
von einem Programm an ein anderes weitergeleitet werden. Auf diese Weise
|
von einem Programm an ein anderes weitergeleitet werden. Auf diese Weise
|
||||||
entsteht eine sogenannte \textit{Pipeline}\index{Pipeline} aus mehreren
|
entsteht eine sogenannte \textit{Pipeline}\index{Pipeline} aus mehreren
|
||||||
Kommandos.
|
Kommandos. Einige Kommandos sind für den Einsatz in einem solchen Konstrukt
|
||||||
|
prädestiniert, obwohl die meisten auch alleine eingesetzt werden können.
|
||||||
|
|
||||||
Einige Kommandos sind für den Einsatz in einem solchen Konstrukt prädestiniert,
|
Übrigens gibt es einen goldenen Merksatz für die Auswahl einiger dieser Tools:
|
||||||
obwohl die meisten auch alleine eingesetzt werden können. Einige dieser
|
|
||||||
Tools sollen im Folgenden vorgestellt werden.
|
Benutze nicht \texttt{awk}, wenn Du \texttt{sed} benutzen kannst. Benutze
|
||||||
|
nicht \texttt{sed}, wenn Du \texttt{grep} benutzen kannst. Benutze nicht
|
||||||
|
\texttt{grep}, wenn Du \texttt{cut} benutzen kannst.
|
||||||
|
|
||||||
|
Der Grund dafür liegt darin, daß diese Programme bei jedem Einsatz gestartet
|
||||||
|
und ausgeführt werden müssen. Und man sollte sich um der Performance willen den
|
||||||
|
kleinsten geeigneten Hammer nehmen.
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \texttt{cut} (\ref{cut}): Teile einer Zeile ausschneiden
|
||||||
|
\item \texttt{grep} (\ref{grep}): In einer Pipe suchen
|
||||||
|
\item \texttt{sed} (\ref{sed}): In einer Pipe editieren
|
||||||
|
\item \texttt{awk} (\ref{awk}): In einer Pipe editieren
|
||||||
|
\item \texttt{sort} (\ref{sort}): Zeilenweises Sortieren
|
||||||
|
\item \texttt{tee} (\ref{tee}): Datenstrom in einer Datei protokollieren
|
||||||
|
\item \texttt{wc} (\ref{wc}): Zeilen, Wörter oder Zeichen zählen
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
grep
|
|
||||||
sed
|
|
||||||
awk
|
|
||||||
sort
|
|
||||||
tee
|
|
||||||
wc
|
|
||||||
\index{Pipe|)}
|
\index{Pipe|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{Prozeßmanagement}\label{prozessmanagement}
|
\subsection{Prozeßmanagement}\label{prozessmanagement}
|
||||||
|
|
||||||
TODO!!
|
Oft werden Shell-Skripte benutzt um Prozesse zu steuern oder zu überwachen. So
|
||||||
|
werden Systemdienste üblicherweise über die Init-Skripte hoch- oder
|
||||||
|
heruntergefahren. Es ist auch nicht sonderlich schwer, mit einem Skript einen
|
||||||
|
`Wachhund' zu implementieren, der regelmäßig kontrolliert ob ein Prozeß noch
|
||||||
|
läuft und ihn bei bedarf nachstartet.
|
||||||
|
|
||||||
ps
|
Für Aufgaben in diesem Bereich stehen unter anderem die folgenden Kommandos zur
|
||||||
pgrep
|
Verfügung.
|
||||||
pkill
|
|
||||||
kill
|
\begin{itemize}
|
||||||
|
\item \texttt{kill} (\ref{kill}): Signal an einen Prozeß schicken
|
||||||
|
\item \texttt{killall} (\ref{killall}): Signal an mehrere Prozesse schicken
|
||||||
|
\item \texttt{ps} (\ref{ps}): Prozeßliste ausgeben
|
||||||
|
\item \texttt{pgrep} (\ref{pgrep}): Bestimmte Prozesse suchen
|
||||||
|
\item \texttt{pkill} (\ref{pkill}): Bestimmte Prozesse töten
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
|
||||||
\section{... und Hämmer}\label{haemmer}
|
\section{... und Hämmer}\label{haemmer}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{awk}\label{awk}\index{awk=\texttt{awk}|(textbf}
|
||||||
|
|
||||||
\subsection{awk}
|
TODO!!! awk
|
||||||
|
|
||||||
TODO!!
|
\index{awk=\texttt{awk}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{basename}\label{basename}\index{basename=\texttt{basename}|(textbf}
|
\subsection{basename}\label{basename}\index{basename=\texttt{basename}|(textbf}
|
||||||
|
|
||||||
Dem Tool \texttt{basename} wird als Parameter ein Pfad zu einer Datei
|
Dem Tool \texttt{basename} wird als Parameter ein Pfad zu einer Datei
|
||||||
übergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name
|
übergeben. Der in der Angabe enthaltene Pfad wird abgeschnitten, nur der Name
|
||||||
der eigentlichen Datei wird zurückgegeben.
|
der eigentlichen Datei wird zurückgegeben. Siehe auch \texttt{dirname}
|
||||||
|
(\ref{dirname}).
|
||||||
|
|
||||||
\index{basename=\texttt{basename}|)}
|
\index{basename=\texttt{basename}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{bc}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{bc}\label{bc}\index{bc=\texttt{bc}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
Mit dem Kommando \texttt{bc} verfügt die Shell praktisch über einen
|
||||||
|
Taschenrechner. Die Man-Page verrät, daß es sich hierbei um ein erstaunlich
|
||||||
|
komplexes Programm handelt, in der Praxis findet man allerdings meistens
|
||||||
|
einfache Anwendungen wie das inkrementieren einer Laufvariable (\texttt{i=`bc
|
||||||
|
\$i + 1`}).
|
||||||
|
|
||||||
|
Bei Multiplikationen ist darauf zu achten, daß der Stern in der Shell eine
|
||||||
|
Sonderbedeutung hat, er muß also gequoted werden: \texttt{i=`bc \$i
|
||||||
|
\textbackslash{}* 3`}.
|
||||||
|
|
||||||
|
Eine andere Möglichkeit für einfache Rechnungen besteht in der sogenannten
|
||||||
|
Arithmetik-Expansion (Siehe \ref{arithmetikexpansion}).
|
||||||
|
|
||||||
|
\index{bc=\texttt{bc}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{cat}\label{cat}\index{cat=\texttt{cat}|(textbf}
|
\subsection{cat}\label{cat}\index{cat=\texttt{cat}|(textbf}
|
||||||
|
|
||||||
Auch \texttt{cat} ist ein oft unterbewertetes Tool. Seine Aufgabe besteht zwar
|
Auch \texttt{cat} ist ein oft unterbewertetes Tool. Seine Aufgabe besteht zwar
|
||||||
@ -139,24 +203,25 @@ Au
|
|||||||
Daten an ein Programm übergeben, das nur von der Standardeingabe lesen kann
|
Daten an ein Programm übergeben, das nur von der Standardeingabe lesen kann
|
||||||
(Filter).
|
(Filter).
|
||||||
|
|
||||||
\texttt{cat} verfügt über eine Reige von Parametern, um die Ausgabe zu
|
\texttt{cat} verfügt über eine Reihe von Parametern, um die Ausgabe zu
|
||||||
formatieren, so können mit \texttt{-n} bzw. \texttt{-b} die Zeilen nummeriert
|
formatieren, so können mit \texttt{-n} bzw. \texttt{-b} die Zeilen numeriert
|
||||||
werden, oder mit \texttt{-s} mehrere Zeilen zu einer einzigen zusammengefaßt
|
werden, oder mit \texttt{-s} mehrere Zeilen zu einer einzigen zusammengefaßt
|
||||||
werden.
|
werden.
|
||||||
|
|
||||||
\index{cat=\texttt{cat}|)}
|
\index{cat=\texttt{cat}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{chpasswd}\label{script}\index{chpasswd=\texttt{chpasswd}|(textbf}
|
\subsection{chpasswd}\label{script}\index{chpasswd=\texttt{chpasswd}|(textbf}
|
||||||
|
|
||||||
Mit diesem Kommando bietet sich dem Administrator des Systems die Möglichkeit,
|
Mit diesem Kommando bietet sich dem Administrator des Systems die
|
||||||
scriptgesteuert die Paßwörter für neue Benutzer zu vergeben. Manuell ändert man
|
Mög\-lich\-keit, scriptgesteuert die Paßwörter für neue Benutzer zu vergeben.
|
||||||
ein Paßwort mit dem Kommando \texttt{passwd}\index{passwd=\texttt{passwd}},
|
Manuell ändert man ein Paßwort mit dem Kommando
|
||||||
allerdings löscht (flusht) dieses Programm die Standard-Eingabe, bevor es das
|
\texttt{passwd}\index{passwd=\texttt{passwd}}, allerdings löscht (flusht)
|
||||||
neue Paßwort erwartet. Somit lassen sich Paßwörter mit \texttt{passwd} nur
|
dieses Programm die Standard-Eingabe, bevor es das neue Paßwort erwartet. Somit
|
||||||
interaktiv ändern\footnote{Es gibt auch einen anderen Weg: Man kann
|
lassen sich Paßwörter mit \texttt{passwd} nur interaktiv ändern\footnote{Es
|
||||||
\texttt{passwd} auch mittels \texttt{expect} fernsteuern. Allerdings ist diese
|
gibt auch einen anderen Weg: Man kann \texttt{passwd} auch mittels
|
||||||
Methode weniger elegant.}.
|
\texttt{expect} fernsteuern. Allerdings ist diese Methode weniger elegant.}.
|
||||||
|
|
||||||
Das Kommando wird in der Form
|
Das Kommando wird in der Form
|
||||||
|
|
||||||
@ -171,14 +236,48 @@ Allerdings sollte dabei aus Sicherheitsgr
|
|||||||
diese Datei nicht allgemein lesbar ist.
|
diese Datei nicht allgemein lesbar ist.
|
||||||
|
|
||||||
\index{chpasswd=\texttt{chpasswd}|)}
|
\index{chpasswd=\texttt{chpasswd}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{cp}\label{cp}\index{cp=\texttt{cp}|(textbf}
|
||||||
|
|
||||||
|
Mit \texttt{cp} werden Dateien kopiert. Die wichtigsten Optionen im
|
||||||
|
Zusammenhang mit Skripten sind \texttt{-f} und \texttt{-R}. Ersteres erzwingt
|
||||||
|
(force) das Kopieren, falls an der Zielstelle schon Dateien existieren werden
|
||||||
|
sie überschrieben. Letzteres ermöglicht ein rekursives Kopieren.
|
||||||
|
Verzeichnisse~---~auch leere~---~können nur mit \texttt{-R} kopiert werden.
|
||||||
|
|
||||||
|
\index{cp=\texttt{cp}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{cut}\label{cut}\index{cut=\texttt{cut}|(textbf}
|
||||||
|
|
||||||
|
Wie der Name (fast) schon sagt, kann man mit diesem Kommando Zeilen
|
||||||
|
zerschneiden. Mit den Parametern \texttt{-c} (Character) oder \texttt{-f}
|
||||||
|
(Field) wird bestimmt, in welcher Einheit die Schnittstellen abgesteckt werden
|
||||||
|
sollen. Falls die Zeilen in Felder zerteilt werden sollen, kann zusätzlich
|
||||||
|
mittels \texttt{-d} der Delimiter, also das Trennzeichen bestimmt werden. Wird
|
||||||
|
das nicht explizit getan, wird der Tabulator benutzt.
|
||||||
|
|
||||||
|
Dieser Definition folgt die Angabe des zu behaltenden Bereichs. Dafür kann eins
|
||||||
|
der Formate N, N-, N-M oder -M benutzt werden.
|
||||||
|
|
||||||
|
\LTXtable{\textwidth}{tab_kommandos_cut_beispiele.tex}
|
||||||
|
|
||||||
|
\index{cut=\texttt{cut}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{dirname}\label{dirname}\index{dirname=\texttt{dirname}|(textbf}
|
\subsection{dirname}\label{dirname}\index{dirname=\texttt{dirname}|(textbf}
|
||||||
|
|
||||||
Analog zu \texttt{basename} gibt \texttt{dirname} nur die Pfad-Komponente einer
|
Analog zu \texttt{basename} (\ref{basename}) gibt \texttt{dirname} nur die
|
||||||
angegebenen Datei zurück.
|
Pfad-Komponente einer angegebenen Datei zurück.
|
||||||
|
|
||||||
\index{dirname=\texttt{dirname}|)}
|
\index{dirname=\texttt{dirname}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{echo}\label{echo}\index{echo=\texttt{echo}|(textbf}
|
\subsection{echo}\label{echo}\index{echo=\texttt{echo}|(textbf}
|
||||||
|
|
||||||
Dies ist wohl der grundlegendste Befehl, der in einem Skript verwendet werden
|
Dies ist wohl der grundlegendste Befehl, der in einem Skript verwendet werden
|
||||||
@ -196,49 +295,42 @@ der Praxis oft als sehr hilfreich:
|
|||||||
\index{echo=\texttt{echo}|)}
|
\index{echo=\texttt{echo}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{expr}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{expr}\label{expr}\index{expr=\texttt{expr}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! expr
|
||||||
|
|
||||||
|
\index{expr=\texttt{expr}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{find}\label{find}\index{find=\texttt{find}|(textbf}
|
||||||
|
|
||||||
|
TODO!!! find
|
||||||
|
|
||||||
|
Siehe auch: Abschnitt \ref{beispiele_suchen_dateien}.
|
||||||
|
|
||||||
|
\index{find=\texttt{find}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{grep}\label{grep}\index{grep=\texttt{grep}|(textbf}
|
\subsection{grep}\label{grep}\index{grep=\texttt{grep}|(textbf}
|
||||||
|
|
||||||
Das Tool \texttt{grep} stammt aus dem Standard-Repertoire eines jeden
|
Das Tool \texttt{grep} stammt aus dem Standard-Repertoire eines jeden
|
||||||
Systemadministrators. Mit seiner Hilfe kann in einer oder mehreren Dateien,
|
Sys\-tem\-ad\-mi\-ni\-stra\-tors. Mit seiner Hilfe kann in einer oder mehreren Dateien,
|
||||||
oder eben auch in einem Datenstrom nach dem Auftreten bestimmter regulärer
|
oder eben auch in einem Datenstrom nach dem Auftreten bestimmter regulärer
|
||||||
Ausdrücke (siehe \ref{mustererkennung}) gesucht werden.
|
Ausdrücke (siehe \ref{mustererkennung}) gesucht werden.
|
||||||
|
|
||||||
TODO!!!
|
|
||||||
|
|
||||||
Die folgende Tabelle stellt einige der vielen Parameter vor:
|
Die folgende Tabelle stellt einige der vielen Parameter vor:
|
||||||
|
|
||||||
\LTXtable{\textwidth}{tab_kommandos_grep_parameter.tex}
|
\LTXtable{\textwidth}{tab_kommandos_grep_parameter.tex}
|
||||||
|
|
||||||
Im Zusammenhang mit grep stößt fast jeder Shell-Skripter früher oder später auf
|
Siehe auch: Abschnitt \ref{beispiele_suchen}.
|
||||||
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}|)}
|
\index{grep=\texttt{grep}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{head}\label{head}\index{head=\texttt{head}|(textbf}
|
\subsection{head}\label{head}\index{head=\texttt{head}|(textbf}
|
||||||
|
|
||||||
\texttt{head} ist das Gegenstück zu \texttt{tail} (Siehe \ref{tail}). Hier
|
\texttt{head} ist das Gegenstück zu \texttt{tail} (Siehe \ref{tail}). Hier
|
||||||
@ -247,16 +339,71 @@ werden allerdings nicht die letzten Zeilen angezeigt, sondern die ersten.
|
|||||||
\index{head=\texttt{head}|)}
|
\index{head=\texttt{head}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{kill}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{kill}\label{kill}\index{kill=\texttt{kill}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! kill
|
||||||
|
|
||||||
|
Übrigens: Die landläufige Annahme ist, daß man mit dem
|
||||||
|
\texttt{kill}-Kom\-man\-do Prozesse `umbringt'. Das ist zwar wahr, aber nicht
|
||||||
|
die ganze Wahrheit.
|
||||||
|
|
||||||
|
\index{kill=\texttt{kill}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{printf}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{killall}\label{killall}\index{killall=\texttt{killall}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! killall
|
||||||
|
|
||||||
|
\index{killall=\texttt{killall}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{mv}\label{mv}\index{mv=\texttt{mv}|(textbf}
|
||||||
|
|
||||||
|
TODO!!! mv
|
||||||
|
|
||||||
|
\index{mv=\texttt{mv}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{pgrep}\label{pgrep}\index{pgrep=\texttt{pgrep}|(textbf}
|
||||||
|
|
||||||
|
TODO!!! pgrep
|
||||||
|
|
||||||
|
Siehe auch: Abschnitt \ref{beispiele_suchen_prozesse}.
|
||||||
|
|
||||||
|
\index{pgrep=\texttt{pgrep}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{pkill}\label{pkill}\index{pkill=\texttt{pkill}|(textbf}
|
||||||
|
|
||||||
|
TODO!!! pkill
|
||||||
|
|
||||||
|
\index{pkill=\texttt{pkill}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{printf}\label{printf}\index{printf=\texttt{printf}|(textbf}
|
||||||
|
|
||||||
|
TODO!!! printf
|
||||||
|
|
||||||
|
\index{printf=\texttt{printf}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{ps}\label{ps}\index{ps=\texttt{ps}|(textbf}
|
||||||
|
|
||||||
|
TODO!!! ps
|
||||||
|
|
||||||
|
Siehe auch: Abschnitt \ref{beispiele_suchen_prozesse}.
|
||||||
|
|
||||||
|
\index{ps=\texttt{ps}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\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
|
||||||
@ -280,7 +427,9 @@ Leerzeichen in die Variable \texttt{var} ein.
|
|||||||
|
|
||||||
Wenn nur eine bestimmte Zahl von Zeichen gelesen werden soll, kann diese durch
|
Wenn nur eine bestimmte Zahl von Zeichen gelesen werden soll, kann diese durch
|
||||||
den Parameter \texttt{-n} angegeben werden. Der Befehl \texttt{read -n 5 var}
|
den Parameter \texttt{-n} angegeben werden. Der Befehl \texttt{read -n 5 var}
|
||||||
liest die ersten fünf Zeichen in die Variable \texttt{var} ein.
|
liest die ersten fünf Zeichen in die Variable \texttt{var} ein. Demzufolge kann
|
||||||
|
ein Skript durch ein \texttt{read -n 1} dazu gebracht werden, auf einen
|
||||||
|
einzelnen Tastendruck~---~nicht zwingend ein Return~---~zu warten.
|
||||||
|
|
||||||
Mit dem Parameter \texttt{-p} kann man einen Prompt, also eine
|
Mit dem Parameter \texttt{-p} kann man einen Prompt, also eine
|
||||||
Eingabeaufforderung ausgeben lassen. \texttt{read -p \dq{}Gib was ein:\dq~var}
|
Eingabeaufforderung ausgeben lassen. \texttt{read -p \dq{}Gib was ein:\dq~var}
|
||||||
@ -308,6 +457,15 @@ Timeout oder ein EOF auf.
|
|||||||
\index{read=\texttt{read}|)}
|
\index{read=\texttt{read}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{rm}\label{rm}\index{rm=\texttt{rm}|(textbf}
|
||||||
|
|
||||||
|
TODO!!! rm
|
||||||
|
|
||||||
|
\index{rm=\texttt{rm}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{script}\label{script}\index{script=\texttt{script}|(textbf}
|
\subsection{script}\label{script}\index{script=\texttt{script}|(textbf}
|
||||||
|
|
||||||
Dieses Kommando eignet sich vorzüglich für das Debuggen fertiger Skripte. Man
|
Dieses Kommando eignet sich vorzüglich für das Debuggen fertiger Skripte. Man
|
||||||
@ -323,32 +481,45 @@ debuggen, da sowohl Ein- als auch Ausgaben in dem Logfile sichtbar sind.
|
|||||||
\index{script=\texttt{script}|)}
|
\index{script=\texttt{script}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{sed}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{sed}\label{sed}\index{sed=\texttt{sed}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! sed
|
||||||
|
|
||||||
|
\index{sed=\texttt{sed}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{seq}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{seq}\label{seq}\index{seq=\texttt{seq}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! seq
|
||||||
|
|
||||||
|
\index{seq=\texttt{seq}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{sleep}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{sleep}\label{sleep}\index{sleep=\texttt{sleep}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! sleep
|
||||||
|
|
||||||
|
\index{sleep=\texttt{sleep}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{sort}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{sort}\label{sort}\index{sort=\texttt{sort}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! sort
|
||||||
|
|
||||||
|
\index{sort=\texttt{sort}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{tail}\label{tail}\index{tail=\texttt{tail}|(textbf}
|
\subsection{tail}\label{tail}\index{tail=\texttt{tail}|(textbf}
|
||||||
|
|
||||||
Der Befehl \texttt{tail} gibt die letzten zehn Zeilen einer Datei aus. Wenn
|
Der Befehl \texttt{tail} gibt die letzten zehn Zeilen einer Datei aus. Wenn
|
||||||
kein Dateiname (oder ein \texttt{-}) angegeben wird, liest \texttt{tail} von
|
kein Dateiname (oder ein \texttt{-}) angegeben wird, liest \texttt{tail} von
|
||||||
der Standard-Eingabe. Man kann die Anzahl der ausgegebenen Zeilen mit dem
|
der Standard-Eingabe. Man kann die Anzahl der ausgegebenen Zeilen mit dem
|
||||||
Parameter \texttt{-l} steuern.
|
Parameter \texttt{-n} steuern.
|
||||||
|
|
||||||
Mit dem Parameter \texttt{-f} (follow) gibt \texttt{tail} neue Zeilen aus,
|
Mit dem Parameter \texttt{-f} (follow) gibt \texttt{tail} neue Zeilen aus,
|
||||||
sobald sie an die Datei angehängt werden.
|
sobald sie an die Datei angehängt werden.
|
||||||
@ -356,11 +527,15 @@ sobald sie an die Datei angeh
|
|||||||
\index{tail=\texttt{tail}|)}
|
\index{tail=\texttt{tail}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{tee}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{tee}\label{tee}\index{tee=\texttt{tee}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! tee
|
||||||
|
|
||||||
|
\index{tee=\texttt{tee}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\subsection{touch}\label{touch}\index{touch=\texttt{touch}|(textbf}
|
\subsection{touch}\label{touch}\index{touch=\texttt{touch}|(textbf}
|
||||||
|
|
||||||
Mit diesem Kommando kann man einerseits Dateien anlegen wenn sie nicht
|
Mit diesem Kommando kann man einerseits Dateien anlegen wenn sie nicht
|
||||||
@ -380,11 +555,25 @@ Referenzdatei angepa
|
|||||||
\index{touch=\texttt{touch}|)}
|
\index{touch=\texttt{touch}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{wc}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{wc}\label{wc}\index{wc=\texttt{wc}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! wc
|
||||||
|
|
||||||
|
\index{wc=\texttt{wc}|)}
|
||||||
|
|
||||||
|
|
||||||
\subsection{who}
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{who}\label{who}\index{who=\texttt{who}|(textbf}
|
||||||
|
|
||||||
TODO!!!
|
TODO!!! who
|
||||||
|
|
||||||
|
\index{who=\texttt{who}|)}
|
||||||
|
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\subsection{xargs}\label{xargs}\index{xargs=\texttt{xargs}|(textbf}
|
||||||
|
|
||||||
|
TODO!!! xargs
|
||||||
|
|
||||||
|
\index{xargs=\texttt{xargs}|)}
|
||||||
|
@ -247,6 +247,23 @@ erzeugen.
|
|||||||
\index{Klammer-Expansion|)}
|
\index{Klammer-Expansion|)}
|
||||||
|
|
||||||
|
|
||||||
|
\section{Arithmetik-Expansion\label{arithmetikexpansion}\index{Arithmetik-Expansion|(textbf}}
|
||||||
|
|
||||||
|
Auch hier werden Klammern expandiert. Allerdings gleich doppelte Klammern. Mit
|
||||||
|
einem Konstrukt in der Form \texttt{i=\$((\$i + 1))} können einfache
|
||||||
|
Berechnungen angestellt werden.
|
||||||
|
|
||||||
|
Dabei wird der Ausdruck in den Klammern bewertet als ob er in doppelten
|
||||||
|
Anführungszeichen stehen würde. Das bedeutet zum Einen, daß man auch mit
|
||||||
|
Variablen rechnen kann, zum anderen macht es das Quoten des Sternchens
|
||||||
|
überflüssig.
|
||||||
|
|
||||||
|
Für komplexere Berechnungen steht das Tool \texttt{bc} (Siehe Abschnitt
|
||||||
|
\ref{bc}) zur Verfügung.
|
||||||
|
|
||||||
|
\index{Arithmetik-Expansion|)}
|
||||||
|
|
||||||
|
|
||||||
\section{Programmablaufkontrolle}
|
\section{Programmablaufkontrolle}
|
||||||
|
|
||||||
Bei der Shell-Programmierung verfügt man über ähnliche Konstrukte wie bei anderen Programmiersprachen, um den Ablauf des Programms zu steuern. Dazu gehören Funktionsaufrufe, Schleifen, Fallunterscheidungen und dergleichen.\nopagebreak
|
Bei der Shell-Programmierung verfügt man über ähnliche Konstrukte wie bei anderen Programmiersprachen, um den Ablauf des Programms zu steuern. Dazu gehören Funktionsaufrufe, Schleifen, Fallunterscheidungen und dergleichen.\nopagebreak
|
||||||
@ -401,8 +418,8 @@ In anderen Sprachen kann man mit der
|
|||||||
Laufvariable\index{Laufvariable} über einen bestimmten Wertebereich iterieren
|
Laufvariable\index{Laufvariable} über einen bestimmten Wertebereich iterieren
|
||||||
lassen (\texttt{for i = 1 to 100...next}). Da das mit der \texttt{for}-Schleife
|
lassen (\texttt{for i = 1 to 100...next}). Da das mit der \texttt{for}-Schleife
|
||||||
der Shell nicht geht\footnote{Auf einigen Systemen steht für diesen Zweck auch
|
der Shell nicht geht\footnote{Auf einigen Systemen steht für diesen Zweck auch
|
||||||
das Kommando \texttt{seq}\index{seq=\texttt{seq}} zur Verfügung.},
|
das Kommando \texttt{seq} (Siehe Abschnitt \ref{seq}) zur Verfügung.}, ersetzt
|
||||||
ersetzt man die Funktion durch geschickte Anwendung der
|
man die Funktion durch geschickte Anwendung der
|
||||||
\texttt{while}-Schleife:\nopagebreak
|
\texttt{while}-Schleife:\nopagebreak
|
||||||
|
|
||||||
\LTXtable{\textwidth}{tab_beisp_while_for.tex}
|
\LTXtable{\textwidth}{tab_beisp_while_for.tex}
|
||||||
|
Loading…
Reference in New Issue
Block a user