Dateien gleichzeitig lesen und schreiben

This commit is contained in:
rschaten 2002-03-22 16:34:33 +00:00
parent 3582465121
commit 7a676d4647

View File

@ -49,3 +49,35 @@ TODO!!!
\subsection{Daten aus einer Subshell hochreichen}
TODO!!!
\subsection{Dateien gleichzeitig lesen und schreiben}
Es kommt vor, daß man eine Datei bearbeiten möchte, die hinterher aber wieder
unter dem gleichen Namen zur Verfügung stehen soll. Beispielsweise sollen alle
Zeilen aus einer Datei entfernt werden, die nicht das Wort \textit{wichtig}
enthalten.
Der erste Versuch an der Stelle wird etwas in der Form
\texttt{grep }\textit{wichtig datei.txt}\texttt{ > }\textit{datei.txt}
sein. Das kann funktionieren, es kann aber auch in die sprichwörtliche Hose
gehen. Das Problem an der Stelle ist, daß die Datei an der Stelle gleichzeitig
zum Lesen und zum Schreiben geöffnet wird. Das Ergebnis ist undefiniert.
Eine Elegante Lösung besteht darin, einen Filedeskriptor auf die Quelldatei zu
legen und diese dann zu löschen. Die Datei wird erst dann wirklich aus dem
Dateisystem entfernt, wenn kein Deskriptor mehr auf sie zeigt. Dann kann aus
dem gerade angelegten Deskriptor gelesen werden, während eine neue Datei unter
dem alten Namen angelegt wird:
\footnotesize
\begin{listing}[2]{1}
#!/bin/sh
FILE=datei.txt
exec 3< "$FILE"
rm "$FILE"
grep "wichtig" <&3 > "$FILE"
\end{listing}
\normalsize