Viele Aenderungen
This commit is contained in:
		| @@ -16,10 +16,10 @@ Einfacher geht es, wenn wir uns ein kurzes Skript schreiben, das alle 30 Sekunde | ||||
| \index{\^=\texttt{\^}}\index{Anf<EFBFBD>hrungszeichen}\index{Pipe}\index{grep=\texttt{grep}}\index{sleep=\texttt{sleep}}\index{who=\texttt{who}} | ||||
| \begin{lstlisting} | ||||
| #!/bin/sh | ||||
| until who | grep "^root " | ||||
| do sleep 30 | ||||
| until who | grep "^root "; do | ||||
|   sleep 30 | ||||
| done | ||||
| echo Big Brother is watching you! | ||||
| echo "Big Brother is watching you!" | ||||
| \end{lstlisting} | ||||
|  | ||||
| Das Skript f<>hrt also so lange das Kommando aus, bis die Ausf<73>hrung erfolgreich | ||||
| @@ -42,10 +42,10 @@ Analog zum vorhergehenden Beispiel kann man auch ein Skript schreiben, das melde | ||||
| \index{\^=\texttt{\^}}\index{Anf<EFBFBD>hrungszeichen}\index{grep=\texttt{grep}}\index{Pipe}\index{sleep=\texttt{sleep}}\index{who=\texttt{who}} | ||||
| \begin{lstlisting} | ||||
| #!/bin/sh | ||||
| while who | grep "^root " | ||||
| do sleep 30 | ||||
| while who | grep "^root "; do | ||||
|   sleep 30 | ||||
| done | ||||
| echo Die Katze ist aus dem Haus, Zeit, da<64> die M<>use tanzen! | ||||
| echo "Die Katze ist aus dem Haus, Zeit, da<64> die M<>use tanzen!" | ||||
| \end{lstlisting} | ||||
|  | ||||
| Die Schleife wird n<>mlich dann so lange ausgef<65>hrt, bis \texttt{grep}\index{grep=\texttt{grep}} einen Fehler (bzw. eine erfolglose Suche) zur<75>ckmeldet. | ||||
| @@ -245,18 +245,31 @@ echo "aflag=$aflag / Name = $name / Die Dateien sind $*" | ||||
| \end{lstlisting} | ||||
|  | ||||
|  | ||||
| \section{Fallensteller: Auf Traps  | ||||
| reagieren}\label{traps}\index{trap=\texttt{trap}|(}\index{Signal|(} | ||||
| \section{Fallensteller: Auf Traps reagieren}\label{traps}\index{trap=\texttt{trap}|(}\index{Signal|(} | ||||
|  | ||||
| Ein laufendes Shell-Skript kann durch Druck auf die Interrupt-Taste (normalerweise \Ovalbox{CTRL}-\Ovalbox{C}) unterbrochen werden. Durch Druck auf diese Taste wird ein Signal an den entsprechenden Proze<7A> gesandt, das ihn bittet sich zu beenden. Dieses Signal hei<65>t SIGINT (f<>r SIGnal INTerrupt) und tr<74>gt die Nummer 2. Das kann ein kleines Problem darstellen, wenn das Skript sich tempor<6F>re Dateien angelegt hat, da diese nach der Ausf<73>hrung nur noch unn<6E>tig Platz verbrauchen und eigentlich gel<65>scht werden sollten.  Man kann sich sicher auch noch wichtigere F<>lle vorstellen, in denen ein Skript bestimmte Aufgaben auf jeden Fall erledigen mu<6D>, bevor es sich beendet. | ||||
| Ein laufendes Shell-Skript kann durch Druck auf die Interrupt-Taste | ||||
| (normalerweise \Ovalbox{CTRL}-\Ovalbox{C}) unterbrochen werden. Durch Druck auf | ||||
| diese Taste wird ein Signal an den entsprechenden Proze<7A> gesandt, das ihn | ||||
| bittet sich zu beenden. Dieses Signal hei<65>t SIGINT (f<>r SIGnal INTerrupt) und | ||||
| tr<EFBFBD>gt die Nummer 2. Das kann ein kleines Problem darstellen, wenn das Skript | ||||
| sich tempor<6F>re Dateien angelegt hat, da diese nach der Ausf<73>hrung nur noch | ||||
| unn<EFBFBD>tig Platz verbrauchen und eigentlich gel<65>scht werden sollten.  Man kann | ||||
| sich sicher auch noch wichtigere F<>lle vorstellen, in denen ein Skript | ||||
| bestimmte Aufgaben auf jeden Fall erledigen mu<6D>, bevor es sich beendet. | ||||
|  | ||||
| Es gibt eine Reihe weiterer Signale, auf die ein Skript reagieren kann. Alle sind in der Man-Page von \texttt{signal} beschrieben. Hier die wichtigsten:\nopagebreak | ||||
| Es gibt eine Reihe weiterer Signale, auf die ein Skript reagieren kann. Alle | ||||
| sind in der Man-Page von \texttt{signal} beschrieben. Hier die | ||||
| wichtigsten:\nopagebreak | ||||
|  | ||||
| \LTXtable{\textwidth}{tab_signale.tex} | ||||
|  | ||||
| Wie l<>st man jetzt dieses Problem? Gl<47>cklicherweise verf<72>gt die Shell <20>ber das \texttt{trap}-Kommando, mit dessen Hilfe man auf diese Signale reagieren kann. Die Anwendung soll in folgendem Skript beispielhaft dargestellt werden. | ||||
| Wie l<>st man jetzt dieses Problem? Gl<47>cklicherweise verf<72>gt die Shell <20>ber das | ||||
| \texttt{trap}-Kommando, mit dessen Hilfe man auf diese Signale reagieren kann. | ||||
| Die Anwendung soll in folgendem Skript beispielhaft dargestellt werden. | ||||
|  | ||||
| Das Skript soll eine komprimierte Textdatei mittels \texttt{zcat} in ein tempor<6F>res File entpacken, dieses mit \texttt{pg} seitenweise anzeigen und nachher wieder l<>schen. | ||||
| Das Skript soll eine komprimierte Textdatei mittels \texttt{zcat} in ein | ||||
| tempor<EFBFBD>res File entpacken, dieses mit \texttt{pg} seitenweise anzeigen und | ||||
| nachher wieder l<>schen. | ||||
|  | ||||
| \index{!==\texttt{!=}} | ||||
| \begin{lstlisting} | ||||
| @@ -266,7 +279,12 @@ temp=/tmp/zeige$$ | ||||
|  | ||||
| \end{lstlisting} | ||||
|  | ||||
| Zun<EFBFBD>chst werden zwei Variablen belegt, die im weiteren Verlauf benutzt werden sollen. In \texttt{stat} wird der Wert abgelegt, den das Skript im Falle eines Abbruchs als Exit-Status zur<75>ckliefern soll. Die Variable \texttt{temp} enth<74>lt den Namen f<>r eine tempor<6F>re Datei. Dieser setzt sich zusammen aus \texttt{/tmp/zeige} und der Proze<7A>nummer des laufenden Skripts. So soll sichergestellt werden, da<64> noch keine Datei mit diesem Namen existiert. | ||||
| Zun<EFBFBD>chst werden zwei Variablen belegt, die im weiteren Verlauf benutzt werden | ||||
| sollen. In \texttt{stat} wird der Wert abgelegt, den das Skript im Falle eines | ||||
| Abbruchs als Exit-Status zur<75>ckliefern soll. Die Variable \texttt{temp} enth<74>lt | ||||
| den Namen f<>r eine tempor<6F>re Datei. Dieser setzt sich zusammen aus | ||||
| \texttt{/tmp/zeige} und der Proze<7A>nummer des laufenden Skripts. So soll | ||||
| sichergestellt werden, da<64> noch keine Datei mit diesem Namen existiert. | ||||
|  | ||||
| \index{Ticks}\index{!>\&=\texttt{!>\&}}\index{\$n=\texttt{\$}$n$}\index{Ticks}\index{Anf<EFBFBD>hrungszeichen}\index{Backticks}\index{basename=\texttt{basename}} | ||||
| \begin{lstlisting}[firstnumber=last] | ||||
| @@ -275,7 +293,17 @@ trap 'echo "`basename $0`: Ooops..." 1>&2' 1 2 15 | ||||
|  | ||||
| \end{lstlisting} | ||||
|  | ||||
| Hier werden die Traps definiert. Bei Signal 0 wird die tempor<6F>re Datei gel<65>scht und der Wert aus der Variable \texttt{stat} als Exit-Code zur<75>ckgegeben. Dabei wird dem \texttt{rm}-Kommando der Parameter\index{Parameter} \texttt{-f} mitgegeben, damit keine Fehlermeldung ausgegeben wird, falls die Datei (noch) nicht existiert. Dieser Fall tritt bei jedem Beenden des Skriptes auf, also sowohl bei einem normalen Ende, als auch beim Exit-Kommando, bei einem Interrupt oder bei einem Kill\index{kill=\texttt{kill}}. Der zweite Trap reagiert auf die Signale 1, 2 und 15. Das hei<65>t, er wird bei jedem unnormalen Ende ausgef<65>hrt. Er gibt eine entsprechende Meldung auf die Standard-Fehlerausgabe (\ref{datenstrom}) aus. Danach wird das Skript beendet, und der erste Trap wird ausgef<65>hrt.  | ||||
| Hier werden die Traps definiert. Bei Signal 0 wird die tempor<6F>re Datei gel<65>scht | ||||
| und der Wert aus der Variable \texttt{stat} als Exit-Code zur<75>ckgegeben. Dabei | ||||
| wird dem \texttt{rm}-Kommando der Parameter\index{Parameter} \texttt{-f} | ||||
| mitgegeben, damit keine Fehlermeldung ausgegeben wird, falls die Datei (noch) | ||||
| nicht existiert. Dieser Fall tritt bei jedem Beenden des Skriptes auf, also | ||||
| sowohl bei einem normalen Ende, als auch beim Exit-Kommando, bei einem | ||||
| Interrupt oder bei einem Kill\index{kill=\texttt{kill}}. Der zweite Trap | ||||
| reagiert auf die Signale 1, 2 und 15. Das hei<65>t, er wird bei jedem unnormalen | ||||
| Ende ausgef<65>hrt. Er gibt eine entsprechende Meldung auf die | ||||
| Standard-Fehlerausgabe (\ref{datenstrom}) aus. Danach wird das Skript beendet, | ||||
| und der erste Trap wird ausgef<65>hrt.  | ||||
|  | ||||
| \index{\$\#=\texttt{\$\#}}\index{!==\texttt{!=}}\index{!>=\texttt{!>}}\index{\$n=\texttt{\$}$n$}\index{Anf<EFBFBD>hrungszeichen}\index{case=\texttt{case}} | ||||
| \begin{lstlisting}[firstnumber=last] | ||||
| @@ -287,7 +315,14 @@ case $# in | ||||
|  | ||||
| \end{lstlisting} | ||||
|  | ||||
| Jetzt kommt die eigentliche Funktionalit<69>t des Skriptes: Das \texttt{case}-Kommando (\ref{case}) testet die Anzahl der <20>bergebenen Parameter\index{Parameter}. Wenn genau ein Parameter\index{Parameter} <20>bergeben wurde, entpackt \texttt{zcat} die Datei, die im ersten Parameter\index{Parameter} angegeben wurde, in die tempor<6F>re Datei. Dann folgt die Seitenweise Ausgabe mittels \texttt{pg}. Nach Beendigung der Ausgabe wird der Status in der Variablen auf 0 gesetzt, damit beim Skriptende der korrekte Exit-Code zur<75>ckgegeben wird. | ||||
| Jetzt kommt die eigentliche Funktionalit<69>t des Skriptes: Das | ||||
| \texttt{case}-Kommando (\ref{case}) testet die Anzahl der <20>bergebenen | ||||
| Parameter\index{Parameter}. Wenn genau ein Parameter\index{Parameter} <20>bergeben | ||||
| wurde, entpackt \texttt{zcat} die Datei, die im ersten | ||||
| Parameter\index{Parameter} angegeben wurde, in die tempor<6F>re Datei. Dann folgt | ||||
| die Seitenweise Ausgabe mittels \texttt{pg}. Nach Beendigung der Ausgabe wird | ||||
| der Status in der Variablen auf 0 gesetzt, damit beim Skriptende der korrekte | ||||
| Exit-Code zur<75>ckgegeben wird. | ||||
|  | ||||
| \index{!>\&=\texttt{!>\&}}\index{\$n=\texttt{\$}$n$}\index{Anf<EFBFBD>hrungszeichen}\index{Backticks}\index{basename=\texttt{basename}} | ||||
| \begin{lstlisting}[firstnumber=last] | ||||
| @@ -296,7 +331,9 @@ esac | ||||
|  | ||||
| \end{lstlisting} | ||||
|  | ||||
| Wenn \texttt{case} eine andere Parameterzahl feststellt, wird eine Meldung mit der Aufrufsyntax auf die Standard-Fehlerausgabe geschrieben. | ||||
| Wenn \texttt{case} eine andere Parameterzahl feststellt, wird eine Meldung mit | ||||
| der Aufrufsyntax auf die Standard-Fehlerausgabe geschrieben. | ||||
|  | ||||
| \index{trap=\texttt{trap}|)}\index{Signal|)} | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -42,7 +42,7 @@ werden um wieder entpackt zu werden. | ||||
|  | ||||
| Ein Beispiel verdeutlicht diese Kopier-F<>higkeit: | ||||
|  | ||||
| \texttt{tar cf - . | ( cd /tmp/backup; tar xf - )} | ||||
| \lstinline_tar cf - . | ( cd /tmp/backup; tar xf - )_ | ||||
|  | ||||
| Hier wird zun<75>chst der Inhalt des aktuellen Verzeichnisses `verpackt'. Das | ||||
| Resultat wird an die Standard-Ausgabe geschrieben. Auf der Empf<70>ngerseite der | ||||
| @@ -57,9 +57,13 @@ Am Ziel-Ort finden sich jetzt die gleichen Dateien wie am Quell-Ort. | ||||
| Das lie<69>e sich lokal nat<61>rlich auch anders l<>sen. Man k<>nnte erst ein Archiv | ||||
| erstellen, das dann an anderer Stelle wieder auspacken. Nachteil: Es mu<6D> | ||||
| gen<EFBFBD>gend Platz f<>r das Archiv vorhanden sein. Denkbar w<>re auch ein in den Raum | ||||
| gestelltes \texttt{cp -Rp * /tmp/backup}. Allerdings fehlen einem dabei | ||||
| mitunter n<>tzliche \texttt{tar}-Optionen\footnote{Mit \texttt{-l} verl<72><6C>t | ||||
| \texttt{tar} beispielsweise nicht das File-System. N<>tzlich wenn eine Partition | ||||
| gestelltes | ||||
|  | ||||
| \lstinline_cp -Rp * /tmp/backup_ | ||||
|  | ||||
| Allerdings fehlen einem dabei mitunter n<>tzliche | ||||
| \texttt{tar}-Optionen\footnote{Mit \texttt{-l} verl<72><6C>t \texttt{tar} | ||||
| beispielsweise nicht das File-System. N<>tzlich wenn nur eine Partition | ||||
| gesichert werden soll.}, und die oben erw<72>hnte Br<42>cke w<>re mit einem reinen | ||||
| \texttt{cp} nicht m<>glich. | ||||
|  | ||||
| @@ -69,14 +73,14 @@ nur unter Vorsicht einsetzen!) schlagen die Br | ||||
| dort wird entweder gepackt und versendet oder quasi die Subshell gestartet und | ||||
| gelesen. Das sieht wie folgt aus: | ||||
|  | ||||
| \texttt{ssh 192.168.2.1 tar clf - / | (cd /mnt/backup; tar xf - )} | ||||
| \lstinline_ssh 192.168.2.1 tar clf - / | (cd /mnt/backup; tar xf - )_ | ||||
|  | ||||
| Hier wird auf einem entfernten Rechner die Root-Partition verpackt, per SSH in | ||||
| das lokale System geholt und lokal im Backup-Verzeichnis entpackt. | ||||
|  | ||||
| Der Weg in die andere Richtung ist ganz <20>hnlich: | ||||
|  | ||||
| \texttt{tar cf - datei.txt | ssh 192.168.2.1 \dq(mkdir -p \$PWD ;cd \$PWD; tar xf -)\dq} | ||||
| \lstinline_tar cf - datei.txt | ssh 192.168.2.1 "(mkdir -p $PWD ;cd $PWD; tar xf -)"_ | ||||
|  | ||||
| Hier wird die Datei verpackt und versendet. Eine Besonderheit gegen<65>ber dem | ||||
| vorigen Beispiel bestehtdarin, da<64> das Zielverzeichnis bei Bedarf erstellt | ||||
|   | ||||
							
								
								
									
										40
									
								
								shell.tex
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								shell.tex
									
									
									
									
									
								
							| @@ -15,6 +15,8 @@ | ||||
|   headsepline,                         % Trennlinie unter die Kopfzeile | ||||
|   pointlessnumbers,                    % Keine Punkte hinter den | ||||
|                                        % Gliederungsnummern | ||||
| %  halfparskip,                         % Abst<73>nde zwischen den Abs<62>tzen, statt | ||||
|                                        % Einr<6E>ckung der ersten Zeile | ||||
| %  draft,                               % Entwurfsmodus | ||||
|   final,                               % Release-Modus | ||||
|   twoside                              % Doppelseitig, f<>r Buch | ||||
| @@ -49,9 +51,11 @@ | ||||
| \lstset{ | ||||
|         extendedchars=true, | ||||
|         backgroundcolor=\color[gray]{0.95}, | ||||
|         basicstyle=\ttfamily\scriptsize, | ||||
|         %basicstyle=\ttfamily\scriptsize, | ||||
|         basicstyle=\ttfamily\footnotesize, | ||||
|         numbers=left, | ||||
|         numberstyle=\tiny, | ||||
|         %numberstyle=\tiny, | ||||
|         numberstyle=\scriptsize, | ||||
|         stepnumber=2, | ||||
|         numbersep=5pt | ||||
| } | ||||
| @@ -104,6 +108,32 @@ | ||||
| \newpage | ||||
| \thispagestyle{empty}                  % eine Leerseite | ||||
| ~\vfill | ||||
|  | ||||
| %\fboxsep 1.36mm | ||||
| %\definecolor{g1}{gray}{0.92} | ||||
| %\newsavebox{\syntaxbox} | ||||
| %\newenvironment{sybox} | ||||
| %{\begin{lrbox}{\syntaxbox} | ||||
| %\begin{minipage}{12.5cm}} | ||||
| %{\end{minipage} | ||||
| %\end{lrbox} | ||||
| %{\fcolorbox{g1}{g1} | ||||
| %{\parbox{12.5cm}{\usebox{\syntaxbox}\hfill\hbox{}}}}} | ||||
| % | ||||
| %\begin{sybox} | ||||
| %Syntaxbox, in der Sonderzeichen wie \verb?%~^? dargestellt werden k<>nnen. | ||||
| % | ||||
| %Dieses Dokument ist entstanden, weil ich f<>r mich selbst eine kompakte | ||||
| %<25>bersicht zu diesem Thema haben wollte. Ich beabsichtige nicht, damit in | ||||
| %irgendeiner Form Kommerz zu machen. Ich stelle es frei zur Verf<72>gung, in der | ||||
| %Hoffnung, da<64> andere Leute daraus vielleicht einen Nutzen ziehen k<>nnen. | ||||
| %\textbf{Aber ich <20>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<64> dieses Dokument~--~oder Teile | ||||
| %daraus~--~verkauft werden darf. \textbf{Dieses Dokument darf nur kostenlos | ||||
| %weitergegeben werden.} | ||||
| %\end{sybox} | ||||
|  | ||||
| \footnotesize | ||||
| Copyright \copyright{} 2000-2005 Ronald Schaten (ronald@schatenseite.de)\bigskip | ||||
|  | ||||
| @@ -139,7 +169,11 @@ chronologischer Reihenfolge ihres Eingreifens): | ||||
|  | ||||
| Und ich bitte alle Leser, auf eventuelle Fehler zu achten und mich darauf | ||||
| aufmerksam zu machen. Auch abgesehen davon freue ich mich <20>ber jede | ||||
| R<EFBFBD>ckmeldung. | ||||
| R<EFBFBD>ckmeldung.\bigskip | ||||
|  | ||||
| Dieses Dokument entstand unter Verwendung von Linux, vim und \LaTeX. Dank an | ||||
| deren Entwickler. | ||||
|  | ||||
| \normalsize | ||||
| \newpage | ||||
| \pagenumbering{roman} | ||||
|   | ||||
| @@ -1,16 +0,0 @@ | ||||
| % $Id$ | ||||
|  \begin{longtable}{|X l|} | ||||
| % KILLED & LINE!!!! \kill | ||||
|  \hline | ||||
|  \endfirsthead | ||||
|  \endhead | ||||
|  \endfoot | ||||
|  \hline | ||||
|  \endlastfoot | ||||
|  | ||||
| \multicolumn{2}{|X|}{\texttt{if who | grep \$1 > /dev/null~~\# who: Liste der Benutzer}\index{Pipe}\index{\$n=\texttt{\$}$n$}\index{!>=\texttt{!>}}\index{who=\texttt{who}}} \\ | ||||
| \multicolumn{2}{|X|}{\texttt{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\# grep: Suche nach Muster}} \\ | ||||
| \multicolumn{2}{|X|}{\texttt{then :~~~~~~~~~~~~~~~~~~~~~~~~\# tut nichts}} \\ | ||||
| \multicolumn{2}{|X|}{\texttt{~else echo \dq Benutzer \$1 ist nicht angemeldet\dq}\index{Anf<EFBFBD>hrungszeichen}} \\ | ||||
| \multicolumn{2}{|X|}{\texttt{fi}} \\ | ||||
| \end{longtable} | ||||
| @@ -240,8 +240,8 @@ awk ' | ||||
|   print $2; | ||||
| }' datei.txt | ||||
|  | ||||
| # Alternativ k<>nnen die Kommandos auch in eine eigene Datei gespeichert und | ||||
| # <20>ber den Parameter -f eingebunden werden: | ||||
| # Alternativ k<>nnen die Kommandos auch in eine eigene Datei gespeichert | ||||
| # und <20>ber den Parameter -f eingebunden werden: | ||||
| awk -f script.awk datei.txt | ||||
| \end{lstlisting} | ||||
|  | ||||
| @@ -313,8 +313,8 @@ Hier ein paar Einfache Beispiele f | ||||
| # Datens<6E>tze mit mehr als zwei Feldern ausw<73>hlen: | ||||
| NF > 2 | ||||
|  | ||||
| # Das dritte und das zweite Feld jeder Zeile ausgeben, deren erstes Feld den | ||||
| # String 'WICHTIG' enth<74>lt: | ||||
| # Das dritte und das zweite Feld jeder Zeile ausgeben, deren erstes Feld | ||||
| # den String 'WICHTIG' enth<74>lt: | ||||
| $1 ~ /WICHTIG/ { print $3, $2 } | ||||
|  | ||||
| # Die Vorkommen von 'muster' z<>hlen, und deren Anzahl ausgeben: | ||||
| @@ -328,19 +328,20 @@ length($0) < 23 | ||||
| # enthalten: | ||||
| NF == 7 && /^Name:/ | ||||
|  | ||||
| # Alle Felder der Eingabedaten zeilenweise in umgekehrter Reihenfolge ausgeben: | ||||
| # Alle Felder der Eingabedaten zeilenweise in umgekehrter Reihenfolge | ||||
| # ausgeben: | ||||
| { | ||||
|   for (i = NF; i >= 1; i--) | ||||
|     print $i | ||||
| } | ||||
|  | ||||
| # Die Gr<47><72>e aller TeX-Dateien addieren, die Summe in kB umrechnen und ausgeben, | ||||
| # verarbeitet die Ausgabe von 'ls -l': | ||||
| # Die Gr<47><72>e aller TeX-Dateien addieren, die Summe in kB umrechnen und | ||||
| # ausgeben, verarbeitet die Ausgabe von 'ls -l': | ||||
| /.*tex/ { summe += $5 } | ||||
| END { summe /= 1024; print "Die Gr<47><72>e aller TeX-Files betr<74>gt", summe, "kB" } | ||||
| END { summe /= 1024; print "Die Gr<47><72>e aller TeX-Files:", summe, "kB" } | ||||
|  | ||||
| # Pipe-Separierte Liste aller gemounteten Partitionen und derer F<>llst<73>nde | ||||
| # ausgeben, verarbeitet die Ausgabe von 'df': | ||||
| # Pipe-Separierte Liste aller gemounteten Partitionen und derer | ||||
| # F<>llst<73>nde ausgeben, verarbeitet die Ausgabe von 'df': | ||||
| BEGIN { OFS="|" } | ||||
| /^\/dev\// { print $1,$5 } | ||||
|  | ||||
| @@ -705,15 +706,20 @@ hier ein paar praktische Beispiele: | ||||
| \begin{lstlisting} | ||||
| # Suche alle Eintr<74>ge in bzw. unter dem aktuellen Verzeichnis: | ||||
| find . | ||||
|  | ||||
| # Suche alle normalen Dateien mit der Endung txt unter /home: | ||||
| find /home -type f -name \*.txt | ||||
| # Suche alle Eintr<74>ge au<61>er symbolischen Links, in die jeder schreiben darf: | ||||
|  | ||||
| # Suche alle Eintr<74>ge au<61>er symbolischen Links, in die jeder schreiben | ||||
| # darf: | ||||
| find / \! -type l -perm 777 | ||||
| # Suche alle Dateien unter dem Homeverzeichnis, deren Gr<47><72>e 10000000 Bytes | ||||
| # <EFBFBD>bersteigt und gib sie ausf<73>hrlich aus: | ||||
|  | ||||
| # Suche alle Dateien unter dem Homeverzeichnis, deren Gr<47><72>e 10000000 | ||||
| # Bytes <20>bersteigt und gib sie ausf<73>hrlich aus: | ||||
| find ~ -size +10000000c -exec ls -l {} \; | ||||
| # Suche alle Eintr<74>ge im Homeverzeichnis, die innerhalb der letzten zwei Tage | ||||
| # ge<EFBFBD>ndert wurden: | ||||
|  | ||||
| # Suche alle Eintr<74>ge im Homeverzeichnis, die innerhalb der letzten zwei | ||||
| # Tage ge<67>ndert wurden: | ||||
| find ~ -mtime -2 | ||||
| \end{lstlisting} | ||||
|  | ||||
| @@ -790,7 +796,8 @@ Es gibt verschiedene Wege, das Signal abzusetzen. Welchen man w | ||||
| Geschmackssache. Hier ein paar Beispiele: | ||||
|  | ||||
| \begin{lstlisting} | ||||
| # Die folgenden Befehle sind gleichwertig. Alle senden ein HUP an Proze<7A>-ID 42: | ||||
| # Die folgenden Befehle sind gleichwertig. Alle senden ein HUP an | ||||
| # Proze<7A>-ID 42: | ||||
| kill -1 42 | ||||
| kill -HUP 42 | ||||
| kill -SIGHUP 42 | ||||
| @@ -798,7 +805,8 @@ kill -s 1 42 | ||||
| kill -s HUP 42 | ||||
| kill -s SIGHUP 42 | ||||
|  | ||||
| # virtueller Selbstmord: Alle Prozesse umbringen, die man umbringen kann: | ||||
| # virtueller Selbstmord: | ||||
| # Alle Prozesse umbringen, die man umbringen kann: | ||||
| kill -9 -1 | ||||
|  | ||||
| # SIGTERM an mehrere Prozesse senden: | ||||
| @@ -1073,8 +1081,8 @@ ps -ely | ||||
| ps ax | ||||
| ps axu | ||||
|  | ||||
| # Proze<7A>baum ausgeben. Das ist in Skripten weniger Sinnvoll, wird hier aber | ||||
| # angegeben weil es so eine praktische Funktion ist... :-) | ||||
| # Proze<7A>baum ausgeben. Das ist in Skripten weniger Sinnvoll, wird hier | ||||
| # aber angegeben weil es so eine praktische Funktion ist... :-) | ||||
| ps -ejH | ||||
| ps axjf | ||||
|  | ||||
| @@ -1229,12 +1237,12 @@ kommando1 | sed 's/alt/neu/' | kommando2 | ||||
| # Aufruf mit einer zu bearbeitenden Datei: | ||||
| sed 's/alt/neu/' datei.txt | ||||
|  | ||||
| # Wenn mehr als ein Kommando ausgef<65>hrt werden soll, mu<6D> der Parameter -e | ||||
| # verwendet werden: | ||||
| # Wenn mehr als ein Kommando ausgef<65>hrt werden soll, mu<6D> der Parameter | ||||
| # -e verwendet werden: | ||||
| sed -e 's/alt/neu/' -e '/loeschen/d' datei.txt | ||||
|  | ||||
| # Man kann auch mehrere Kommandos mit einem -e aufrufen, wenn sie durch ein | ||||
| # Semikolon getrennt werden: | ||||
| # Man kann auch mehrere Kommandos mit einem -e aufrufen, wenn sie durch | ||||
| # ein Semikolon getrennt werden: | ||||
| sed 's/alt/neu/; /loeschen/d' datei.txt | ||||
|  | ||||
| # In einem Skript kann das Kommando auch <20>ber mehrere Zeilen gehen: | ||||
| @@ -1242,8 +1250,8 @@ sed ' | ||||
| s/alt/neu/ | ||||
| /loeschen/d' datei.txt | ||||
|  | ||||
| # Alternativ k<>nnen die Kommandos auch in eine eigene Datei gespeichert und | ||||
| # <20>ber den Parameter -f eingebunden werden: | ||||
| # Alternativ k<>nnen die Kommandos auch in eine eigene Datei gespeichert | ||||
| # und <20>ber den Parameter -f eingebunden werden: | ||||
| sed -f script.sed datei.txt | ||||
| \end{lstlisting} | ||||
|  | ||||
| @@ -1330,10 +1338,12 @@ sed 's/rot/blau/'   # Ersetzt nur das erste Vorkommen in jeder Zeile | ||||
| sed 's/rot/blau/4'  # Ersetzt nur das vierte Vorkommen in jeder Zeile | ||||
| sed 's/rot/blau/g'  # Ersetzt nur jedes Vorkommen in jeder Zeile | ||||
|  | ||||
| # 'rot' durch 'blau' ersetzen, aber NUR in Zeilen die auch 'gelb' enthalten: | ||||
| # 'rot' durch 'blau' ersetzen, aber NUR in Zeilen die auch 'gelb' | ||||
| # enthalten: | ||||
| sed '/gelb/s/rot/blau/g' | ||||
|  | ||||
| # 'rot' durch 'blau' ersetzen, AUSSER in Zeilen die auch 'gelb' enthalten: | ||||
| # 'rot' durch 'blau' ersetzen, AUSSER in Zeilen die auch 'gelb' | ||||
| # enthalten: | ||||
| sed '/gelb/!s/rot/blau/g' | ||||
|  | ||||
| # 'rosa', 'hellrot' und 'magenta' durch 'pink' ersetzen: | ||||
| @@ -1344,9 +1354,10 @@ gsed 's/rosa\|hellrot\|magenta/pink/g'                # nur in GNU sed | ||||
| # lies: 'ersetze jeden Zeilenanfang durch f<>nf Leerzeichen' | ||||
| sed 's/^/     /' | ||||
|  | ||||
| # F<>hrende Blanks (Leerzeichen, Tabulatoren) von den Zeilenanf<6E>ngen l<>schen: | ||||
| # ACHTUNG: An Stelle des \t mu<6D> der Tabulator gedr<64>ckt werden, die Darstellung | ||||
| #          als \t versteht nicht jedes sed! | ||||
| # F<>hrende Blanks (Leerzeichen, Tabulatoren) von den Zeilenanf<6E>ngen | ||||
| # l<EFBFBD>schen: | ||||
| # ACHTUNG: An Stelle des \t mu<6D> der Tabulator gedr<64>ckt werden, die | ||||
| #          Darstellung als \t versteht nicht jedes sed! | ||||
| sed 's/^[ \t]*//' | ||||
|  | ||||
| # Schliessende Blanks vom Zeilenende l<>schen, siehe oben: | ||||
| @@ -1612,6 +1623,30 @@ Kommando gibt zm Beispiel eine Fehlermeldung aus wenn sein Skript ein Signal 1 | ||||
| Die Zeile ist dem Beispiel aus Abschnitt \ref{traps} entnommen, dort findet | ||||
| sich auch nochmal eine ausf<73>hrliche Erkl<6B>rung. | ||||
|  | ||||
| Ein weiterer n<>tzlicher Einsatz f<>r \texttt{trap} ist es, Signale zu | ||||
| ignorieren. Das kann gew<65>nscht sein, wenn eine Folge von Kommandos in einem | ||||
| Skript auf keinen Fall unterbrochen werden darf. Um zu verhindern da<64> ein | ||||
| \Ovalbox{CTRL}-\Ovalbox{C} des Benutzers das Skript beendet wird folgendes | ||||
| Konstrukt eingesetzt: | ||||
|  | ||||
| \begin{lstlisting} | ||||
| trap '' 2  # Signal 2 ist Ctrl-C, jetzt deaktiviert. | ||||
| kommando1 | ||||
| kommando2 | ||||
| kommando3 | ||||
| trap 2     # Reaktiviert Ctrl-C | ||||
| \end{lstlisting} | ||||
|  | ||||
| Vielleicht w<>re es aber auch dem Benutzer gegen<65>ber freundlicher, auf das | ||||
| entkr<EFBFBD>ftete Signal hinzuweisen: | ||||
|  | ||||
| \lstinline|trap 'echo "Ctrl-C ist ausser Kraft."' 2| | ||||
|  | ||||
| Eine Sonderbehandlung macht die Shell, wenn als Signal \texttt{DEBUG} angegeben | ||||
| wird. Dann wird nach jedem ausgef<65>hrten Kommando der Trap ausgel<65>st. Dieses | ||||
| Feature wird wie der Name schon erahnen l<><6C>t zum Debuggen benutzt, ein Beispiel | ||||
| findet sich in Abschnitt \ref{fehlersuche}. | ||||
|  | ||||
| \index{trap=\texttt{trap}|)} | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -54,7 +54,7 @@ da | ||||
| kann man an der Shell durch Eingabe von \lstinline/echo $PATH/\index{\$PATH=\texttt{\$PATH}} herausfinden. | ||||
|  | ||||
|  | ||||
| \section{Fehlersuche} | ||||
| \section{Fehlersuche}\label{fehlersuche}\index{Fehlersuche|(}\index{debuggen|(} | ||||
|  | ||||
| Es gibt f<>r Shell-Skripte keine wirklichen Debugger, aber trotzdem verf<72>gt man | ||||
| <EFBFBD>ber einige bew<65>hrte Methoden zum Aufsp<73>ren von Fehlern: | ||||
| @@ -86,6 +86,18 @@ Aufruf  | ||||
| Zeile vor der Ausf<73>hrung aus, allerdings im Gegensatz zu \texttt{-x} nicht in | ||||
| der expandierten sondern in der vollen Form. | ||||
|  | ||||
| \item \texttt{set -e}: Alle g<>ngigen Shell-Kommandos liefern einen | ||||
| R<EFBFBD>ckgabewert, der Auskunft <20>ber Erfolg oder Mi<4D>erfolg gibt (siehe Abschnitt | ||||
| \ref{exitcode}). Normalerweise liegt es beim Programmierer, diese Werte zu | ||||
| interpretieren. Setzt man aber mit dem Schalter \texttt{-e} den sogenannten | ||||
| errexit-Modus, beendet die Shell das Skript sobald ein Kommando sich mit einem | ||||
| R<EFBFBD>ckgabewert ungleich 0 beendet. | ||||
|  | ||||
| Ausnahmen gibt es lediglich, wenn das betroffene Kommando in ein Konstrukt | ||||
| wie \texttt{while}, \texttt{until} oder \texttt{if} eingebunden ist. Auch wenn | ||||
| der R<>ckgabewert mittels \texttt{\&\&} oder \texttt{||} verarbeitet wird, | ||||
| beendet sich die Shell nicht. | ||||
|  | ||||
| \item System-Log: F<>r das direkte Debuggen ist dieser Weg weniger geeignet, | ||||
| aber gerade in unbeobachtet laufenden Skripten sollte man unerwartete Zust<73>nde | ||||
| oder besondere Ereignisse im System-Log festhalten. Dies geschieht mit dem | ||||
| @@ -98,12 +110,22 @@ eine l | ||||
| Ruhe analysiert werden. Das Kommando wird in Abschnitt \ref{script} | ||||
| beschrieben. | ||||
|  | ||||
| TODO: Debuggen | ||||
| %http://localhost/~rschaten/doku/abs-guide/debugging.html#FTN.AEN14050 | ||||
| %-> trapping signals | ||||
| \item \texttt{tee}: Wenn Ausgaben eines Kommandos durch den Filter \texttt{tee} | ||||
| geschoben werden, k<>nnen sie in einer Datei mitgeschrieben werden. Auch diese | ||||
| Variante bietet einen stre<72>freien Blick auf unter Umst<73>nden sehr lange und | ||||
| komplexe Ausgaben. Abschnitt \ref{tee} gibt weitere Hinweise zu dem Kommando. | ||||
|  | ||||
| \item Variablen `tracen': Das Kommando \texttt{trap} (Abschnitt \ref{trap}) | ||||
| reagiert auf Signale. Die Shell erzeugt nach jedem Kommando das Signal DEBUG, | ||||
| so da<64> mit dem folgenden Kommando daf<61>r gesorgt werden kann, da<64> der Inhalt | ||||
| einer Variablen nach jedem Kommando ausgegeben wird: | ||||
|  | ||||
| \lstinline|trap 'echo "Trace> \$var = \"$var\""' DEBUG| | ||||
|  | ||||
| \end{itemize} | ||||
|  | ||||
| \index{Fehlersuche|)}\index{debuggen|)} | ||||
|  | ||||
|  | ||||
| \section{R<EFBFBD>ckgabewerte}\label{exitcode}\index{R<EFBFBD>ckgabewert|(textbf}\index{Exit-Code|see{R<EFBFBD>ckgabewert}}\index{Exit-Status|see{R<EFBFBD>ckgabewert}} | ||||
|  | ||||
| @@ -286,11 +308,16 @@ Die folgenden Zeichen k | ||||
| \index{Quoting|)} | ||||
|  | ||||
|  | ||||
| \section{Meta-Zeichen}\index{Meta-Zeichen|(textbf}\index{Wildcards|see{Metazeichen}}\index{Joker-Zeichen|see{Metazeichen}}\index{Platzhalter|see{Metazeichen}}\label{metazeichen} | ||||
| \section{Meta-Zeichen}\index{Meta-Zeichen|(textbf}\index{Wildcards|see{Metazeichen}}\index{Joker-Zeichen|see{Metazeichen}}\index{Platzhalter|see{Metazeichen}}\index{Globbing|see{Metazeichen}}\label{metazeichen} | ||||
| \index{*=\texttt{*}|(textbf}\index{?=\texttt{?}|(textbf}\index{[abc]=\texttt{[}\textsl{abc}\texttt{]}|(textbf}\index{[a-q]=\texttt{[}\textsl{a}\texttt{-}\textsl{q}\texttt{]}|(textbf}\index{[!!abc]=\texttt{[!!}\textsl{abc}\texttt{]}|(textbf}\index{Dateinamen|(textbf} | ||||
| \index{\~{}=\texttt{\~{}}|(textbf}\index{\~{}name=\texttt{\~{}}\textsl{name}|(textbf}\index{\~{}+=\texttt{\~{}+}|(textbf}\index{\~{}-=\texttt{\~{}-}|(textbf} | ||||
|  | ||||
| Bei der Angabe von Dateinamen k<>nnen eine Reihe von Meta-Zeichen\footnote{Meta-Zeichen werden auch Wildcards, Joker-Zeichen oder Platzhalter genannt.} verwendet werden, um mehrere Dateien gleichzeitig anzusprechen oder um nicht den vollen Dateinamen ausschreiben zu m<>ssen. | ||||
| Bei der Angabe von Dateinamen k<>nnen eine Reihe von | ||||
| Meta-Zeichen\footnote{Meta-Zeichen werden auch Wildcards, Joker-Zeichen oder | ||||
| Platzhalter genannt. Meint man die Expansion der Meta-Zeichen zu Dateinamen ist | ||||
| auch von `Globbing' die Rede.} verwendet werden, um mehrere Dateien | ||||
| gleichzeitig anzusprechen oder um nicht den vollen Dateinamen ausschreiben zu | ||||
| m<EFBFBD>ssen. | ||||
|  | ||||
| Die wichtigsten Meta-Zeichen sind:\nopagebreak | ||||
| \LTXtable{\textwidth}{tab_metazeichen.tex} | ||||
| @@ -317,10 +344,9 @@ das Suchmuster \texttt{.*}. | ||||
|  | ||||
| Man unterscheidet in der Shell-Programmierung zwischen den | ||||
| Meta-Zeichen\index{Meta-Zeichen}, die bei der Bezeichnung von Dateinamen | ||||
| eingesetzt werden (sogenanntes `Globbing'\index{Globbing}) und den | ||||
| Meta-Zeichen, die in mehreren Programmen Verwendung finden, um z. B. Suchmuster | ||||
| zu definieren. Diese Muster werden auch regul<75>re Ausdr<64>cke (regular | ||||
| expression)\index{Regular Expression|see{Regul<EFBFBD>rer | ||||
| eingesetzt werden und den Meta-Zeichen, die in mehreren Programmen Verwendung | ||||
| finden, um z. B. Suchmuster zu definieren. Diese Muster werden auch regul<75>re | ||||
| Ausdr<EFBFBD>cke (regular expression)\index{Regular Expression|see{Regul<EFBFBD>rer | ||||
| Ausdruck}}\index{Expression|see{Regul<EFBFBD>rer | ||||
| Ausdruck}}\index{Ausdruck|see{Regul<EFBFBD>rer Ausdruck}} genannt. Sie bieten | ||||
| wesentlich mehr M<>glichkeiten als die relativ einfachen Wildcards f<>r | ||||
| @@ -491,9 +517,14 @@ der Bourne-Shell wirkt das f | ||||
|  | ||||
| Dieser Befehl tut nichts, au<61>er den Status 0 zur<75>ckzugeben. Er wird benutzt, um Endlosschleifen\index{Endlosschleife} zu schreiben (siehe unter \ref{while}), oder um leere Bl<42>cke in \texttt{if}- oder \texttt{case}-Konstrukten\index{if=\texttt{if}}\index{case=\texttt{case}} m<>glich zu machen. | ||||
|  | ||||
| \medskip\emph{Beispiel:} Pr<50>fen, ob jemand angemeldet ist:\nopagebreak | ||||
| \LTXtable{\textwidth}{tab_beisp_nullbefehl.tex} | ||||
| \index{Null-Befehl|)} | ||||
| \begin{lstlisting} | ||||
| if who | grep $1 > /dev/null; then      # who: Liste der Benutzer | ||||
|                                         # grep: Suche nach Muster | ||||
|    :                                    # tut nichts | ||||
| else | ||||
|    echo "Benutzer $1 ist nicht angemeldet" | ||||
| fi | ||||
| \end{lstlisting} | ||||
|  | ||||
|  | ||||
| \subsection{Source (\texttt{.})}\label{source}\index{source=\texttt{source}|(textbf}\index{.=\texttt{.}|see{source}} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user