Bash: Dlaczego odczytywanie i zapisywanie do tego samego pliku w potoku generuje niewiarygodne wyniki?

Mam pęczek plików zawierających wiele pustych wierszy i chcę usunąć powtarzające się puste linie, aby ułatwić czytanie plików. Napisałem następujący skrypt:

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

Miało to jednak bardzo niewiarygodne wyniki, ponieważ większość plików była całkowicie pusta, a tylko kilka plików miało zamierzone rezultaty. Co więcej, pliki, które działały, wydawały się zmieniać losowo za każdym razem, gdy próbowałem, ponieważ różne pliki byłyby poprawnie edytowane w każdym uruchomieniu. Co się dzieje?

Uwaga: jest to bardziej teoretyczne pytanie, ponieważ zdaję sobie sprawę, że mogę użyć obejścia takiego jak:

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

Ale to wydaje się niepotrzebnie zawiłe. Dlaczego więc metoda „bezpośrednia” jest tak zawodna?

questionAnswers(2)

yourAnswerToTheQuestion