Bash: Por que ler e gravar no mesmo arquivo em um pipeline produz resultados não confiáveis?

Eu tenho um monte de arquivos que contêm muitas linhas em branco, e quero remover todas as linhas em branco repetidas para facilitar a leitura dos arquivos. Eu escrevi o seguinte script:

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

No entanto, isso teve resultados muito incertos, com a maioria dos arquivos ficando completamente vazios e apenas alguns arquivos tendo os resultados pretendidos. Além do mais, os arquivos que funcionavam pareciam mudar aleatoriamente toda vez que eu tentava novamente, pois arquivos diferentes seriam corretamente editados em todas as execuções. O que está acontecendo?

Nota: Esta é mais uma questão teórica, porque eu percebo que poderia usar uma solução como:

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

Mas isso parece desnecessariamente complicado. Então, por que o método "direto" é tão pouco confiável?

questionAnswers(2)

yourAnswerToTheQuestion