Bash: Warum führt das Lesen und Schreiben derselben Datei in einer Pipeline zu unzuverlässigen Ergebnissen?

Ich habe eine Reihe von Dateien, die viele Leerzeilen enthalten, und möchte alle wiederholten Leerzeilen entfernen, um das Lesen der Dateien zu erleichtern. Ich habe folgendes Skript geschrieben:

#!/bin/bash
for file in * ; do cat "$file" | sed 's/^ \+//' | cat -s > "$file" ; done

Dies führte jedoch zu sehr unzuverlässigen Ergebnissen, wobei die meisten Dateien vollständig leer wurden und nur wenige Dateien die beabsichtigten Ergebnisse zeigten. Außerdem schienen sich die Dateien, die funktionierten, bei jedem erneuten Versuch nach dem Zufallsprinzip zu ändern, da bei jedem Durchlauf verschiedene Dateien korrekt bearbeitet wurden. Was ist los?

Hinweis: Dies ist eher eine theoretische Frage, da mir klar ist, dass ich eine Problemumgehung wie die folgende verwenden könnte:

#!/bin/bash
for file in * ; do 
    cat "$file" | sed 's/^ \+//' | cat -s > "$file"-tmp
    rm "$file"
    mv "$file"-tmp "$file"
done

Aber das scheint unnötig kompliziert zu sein. Warum ist die "direkte" Methode so unzuverlässig?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage