Dateien gleichzeitig lesen und schreiben
This commit is contained in:
parent
3582465121
commit
7a676d4647
@ -49,3 +49,35 @@ TODO!!!
|
|||||||
\subsection{Daten aus einer Subshell hochreichen}
|
\subsection{Daten aus einer Subshell hochreichen}
|
||||||
|
|
||||||
TODO!!!
|
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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user