Bash: Почему чтение и запись в один и тот же файл в конвейере дают ненадежные результаты?

У меня есть куча файлов, которые содержат много пустых строк, и хочу удалить все повторяющиеся пустые строки, чтобы облегчить чтение файлов. Я написал следующий скрипт:

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

Однако это дало очень ненадежные результаты: большинство файлов стали полностью пустыми, и только несколько файлов имели ожидаемые результаты. Более того, работающие файлы менялись случайным образом каждый раз, когда я повторял попытку, так как разные файлы корректно редактировались при каждом запуске. В чем дело?

Примечание. Это скорее теоретический вопрос, потому что я понимаю, что могу использовать обходной путь, например:

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

Но это кажется излишне запутанным. Так почему же «прямой» метод так ненадежен?

Ответы на вопрос(2)

Ваш ответ на вопрос