Em um conjunto de processos em pipeline, é quase sempre um erro terrível escrever em um arquivo que também está sendo lido ao mesmo tempo.
Isso ocorre porque as operações de gravação ocorrem simultaneamente com as operações de leitura. Geralmente resultando em um arquivo prematuramente truncado. No passado, isso surpreendeu as pessoas mais acostumadas com pipelines DOS, onde o sistema operacional serializava os processos por meio de arquivos temporários ocultos (ou seu equivalente moral)
As soluções envolvem principalmente o uso de arquivos temporários e sua renomeação após a conclusão.
somecommand < infile | tee tempfile; mv tempfile infile
Obviamente, isso pode introduzir outros problemas.
Alguns utilitários (awk, perl etc) lidam com isso para você se você der a eles opções de linha de comando apropriadas.
perl -i -e 'somecommands' infile ...
Observe que o problema que você enfrenta não tem nada a ver com cat
. No meu exemplo, evitei uso desnecessário de gatos , em parte para deixar isso claro, em parte por tradição.