Viele Aenderungen, Tabellen durch Syntax-Boxen ausgetauscht, neues Kapitel: date
This commit is contained in:
@@ -83,7 +83,7 @@ Der Weg in die andere Richtung ist ganz
|
||||
\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
|
||||
vorigen Beispiel besteht darin, da<64> das Zielverzeichnis bei Bedarf erstellt
|
||||
wird, bevor die Datei dort entpackt wird. Zur Erkl<6B>rung: Die Variable
|
||||
\texttt{\$PWD} wird, da sie nicht von Ticks `gesichert' wird, schon lokal durch
|
||||
die Shell expandiert. An dieser Stelle erscheint also auf dem entfernten System
|
||||
@@ -195,74 +195,24 @@ sechs Kilobytes~--~
|
||||
|
||||
Um es nochmal zu betonen: Diese beiden Methoden sind mit Vorsicht zu genie<69>en.
|
||||
Bei der ersten f<>hrt jede zus<75>tzliche oder gel<65>schte Zeile zu einer kaputten
|
||||
Ausgabedatei, bei der zweiten reichen schon einzelne Zeilen. In jedem Fall
|
||||
Ausgabedatei, bei der zweiten reichen schon einzelne Zeichen. In jedem Fall
|
||||
sollte nach dem Auspacken noch einmal mittels \texttt{sum} oder \texttt{md5sum}
|
||||
eine Checksumme gezogen und verglichen werden.
|
||||
|
||||
\section{Dateien, die es nicht gibt}
|
||||
|
||||
TODO!!! Dateien, die es nicht gibt
|
||||
Eine Eigenart der Behandlung von Dateien unter Unix besteht im Verhalten beim
|
||||
L<EFBFBD>schen. Gel<65>scht wird n<>mlich zun<75>chst nur der Inode, also die Markierung im
|
||||
Dateisystem unter der die Datei gefunden werden kann. Physikalisch besteht die
|
||||
Datei noch, sie wird lediglich im Verzeichnis nicht mehr angezeigt.
|
||||
|
||||
\subsection{Speichern in nicht existente Dateien}
|
||||
Hat ein Proze<7A> die Datei noch in irgendeiner Form ge<67>ffnet, kann er weiter
|
||||
darauf zugreifen. Erst wenn er die Datei schlie<69>t ist sie tats<74>chlich und
|
||||
unwiederbringlich `weg'.
|
||||
|
||||
TODO!!! Speichern in nicht existente Dateien
|
||||
Dieser Effekt der `nicht existenten Dateien' l<><6C>t sich an verschiedenen Stellen
|
||||
geschickt einsetzen.
|
||||
|
||||
\subsection{Subshell-Schleifen vermeiden}\label{subshellschleifen}
|
||||
|
||||
Wir wollen ein Skript schreiben, das die \texttt{/etc/passwd} liest und dabei
|
||||
z<EFBFBD>hlt, wie viele Benutzer eine UID kleiner als 100 haben.
|
||||
|
||||
Folgendes Skript funktioniert nicht:
|
||||
|
||||
\begin{lstlisting}
|
||||
#!/bin/sh
|
||||
count=0
|
||||
cat /etc/passwd | while read i; do
|
||||
uid=`echo $i | cut -f 3 -d:`
|
||||
if [ $uid -lt 100 ]; then
|
||||
count=`expr $count + 1`
|
||||
echo $count
|
||||
fi
|
||||
done
|
||||
echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen
|
||||
\end{lstlisting}
|
||||
|
||||
Was ist passiert?
|
||||
|
||||
Dieses Skript besteht im Wesentlichen aus einer Pipe. Wir haben ein
|
||||
\texttt{cat}-Kom\-man\-do, das den Inhalt der \texttt{/etc/passwd} durch eben
|
||||
diese Pipe an eine Schleife <20>bergibt. Das \texttt{read}-Kommando in der
|
||||
Schleife liest die einzelnen Zeilen aus, dann folgt ein Bi<42>chen Auswertung.
|
||||
|
||||
Es ist zu beobachten, da<64> bei der Ausgabe in Zeile 7 die Variable
|
||||
\texttt{\$count} korrekte Werte enth<74>lt. Um so unverst<73>ndlicher ist es, da<64> sie
|
||||
nach der Vollendung der Schleife wieder den Wert 0 enth<74>lt.
|
||||
|
||||
Das liegt daran, da<64> diese Schleife als Teil einer Pipe in einer Subshell
|
||||
ausgef<EFBFBD>hrt wird. Die Variable \texttt{\$count} steht damit in der Schleife
|
||||
praktisch nur lokal zur Verf<72>gung, sie wird nicht an das umgebende Skript
|
||||
`hochgereicht'.
|
||||
|
||||
Neben der Methode in \ref{daten_hochreichen} bietet sich hier eine viel
|
||||
einfachere L<>sung an:
|
||||
|
||||
\begin{lstlisting}
|
||||
#!/bin/sh
|
||||
count=0
|
||||
while read i; do
|
||||
uid=`echo $i | cut -f 3 -d:`
|
||||
if [ $uid -lt 100 ]; then
|
||||
count=`expr $count + 1`
|
||||
echo $count
|
||||
fi
|
||||
done < /etc/passwd
|
||||
echo Es sind $count Benutzer mit einer ID kleiner 100 eingetragen
|
||||
\end{lstlisting}
|
||||
|
||||
Hier befindet sich die Schleife nicht in einer Pipe, daher wird sie auch nicht
|
||||
in einer Subshell ausgef<65>hrt. Man kann auf das \texttt{cat}-Kommando verzichten
|
||||
und den Inhalt der Datei durch die Umlenkung in Zeile 9 direkt auf die
|
||||
Standardeingabe der Schleife (und somit auf das \texttt{read}-Kommando) legen.
|
||||
|
||||
\subsection{Daten aus einer Subshell hochreichen}\label{daten_hochreichen}
|
||||
|
||||
@@ -297,7 +247,7 @@ geht man in solchen F
|
||||
Bei einfachen Zahlenwerten k<>nnte beispielsweise ein R<>ckgabewert helfen.
|
||||
Komplexere Informationen k<>nnen in eine tempor<6F>re Datei geschrieben werden, die
|
||||
danach geparst werden m<><6D>te. Wenn die Informationen in Zeilen der Form
|
||||
`VARIABLE=\dq{}Wert\dq{}' gespeichert werden, kann die Datei einfach mittels
|
||||
\lstinline|VARIABLE="Wert"| gespeichert werden, kann die Datei einfach mittels
|
||||
\texttt{source} (Abschnitt \ref{source}) oder einem Konstrukt der Art
|
||||
\texttt{eval `cat tempfile`} gelesen werden.
|
||||
|
||||
|
Reference in New Issue
Block a user