Dies ist sehr gut möglich. Sie müssen lediglich sicherstellen, dass Sie die Ausgabe zum Zeitpunkt des Schreibens in eine andere Datei schreiben. Dies kann erreicht werden, indem die Datei nach dem Öffnen eines Dateideskriptors entfernt wird, aber bevor Sie darauf schreiben:
exec 3<file ; rm file; COMMAND <&3 >file ; exec 3>&-
Oder Zeile für Zeile, um es besser zu verstehen:
exec 3<file # open a file descriptor reading 'file'
rm file # remove file (but fd3 will still point to the removed file)
COMMAND <&3 >file # run command, with the removed file as input
exec 3>&- # close the file descriptor
Es ist immer noch eine riskante Sache, denn wenn COMMAND nicht richtig ausgeführt wird, verlieren Sie den Dateiinhalt. Dies kann durch Wiederherstellen der Datei verringert werden, wenn COMMAND einen Exit-Code ungleich Null zurückgibt:
exec 3<file ; rm file; COMMAND <&3 >file || cat <&3 >file ; exec 3>&-
Wir können auch eine Shell-Funktion definieren, um die Verwendung zu vereinfachen:
# Usage: replace FILE COMMAND
replace() { exec 3<$1 ; rm $1; ${@:2} <&3 >$1 || cat <&3 >$1 ; exec 3>&- }
Beispiel:
$ echo aaa > test
$ replace test tr a b
$ cat test
bbb
Beachten Sie außerdem, dass dadurch eine vollständige Kopie der Originaldatei erhalten bleibt (bis der dritte Dateideskriptor geschlossen wird). Wenn Sie Linux verwenden und die Datei, die Sie verarbeiten, zu groß ist, um zweimal auf die Festplatte zu passen, können Sie dieses Skript auschecken, mit dem die Datei blockweise an den angegebenen Befehl weitergeleitet wird, während die Zuordnung der bereits verarbeiteten Datei aufgehoben wird Blöcke. Lesen Sie wie immer die Warnungen auf der Verwendungsseite.