From 7a676d4647e209f60bd8da836d577d20ccfd8da4 Mon Sep 17 00:00:00 2001 From: rschaten Date: Fri, 22 Mar 2002 16:34:33 +0000 Subject: [PATCH] Dateien gleichzeitig lesen und schreiben --- schmutzige_tricks.tex | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/schmutzige_tricks.tex b/schmutzige_tricks.tex index d610889..0ed40bc 100644 --- a/schmutzige_tricks.tex +++ b/schmutzige_tricks.tex @@ -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 +