Por exemplo, aqui está o meu comando que estou usando:
tr -d '\n' < newfile.ppm
Quero enviar os resultados exatamente para o mesmo arquivo, então estou fazendo agora:
tr -d '\n' < newfile.ppm > newfile.ppm
Por que isso não está funcionando e como posso fazê-lo funcionar?
Responder1
Esta é uma “pegadinha” extremamente comum.
Quando você redireciona stdout ou stderr para gravar em um arquivo, o shell primeiro truncará o arquivo para prepará-lo para gravação. Então, o que está ocorrendo é aproximadamente o seguinte:
- Seu shell define stdin para
newfile.ppm
- Seu shell é truncado
newfile.ppm
para comprimento 0 - Seu shell define stdout como
newfile.ppm
- Seu shell é executado
tr -d '\n'
. Como você pode ver, neste ponto o conteúdonewfile.ppm
já desapareceu, então não há nada para ler.
Para contornar isso, basta enviar para outro arquivo. Você pode renomeá-lo depois
Responder2
Isso fará o trabalho que você deseja.
[stephan@stephan] ~
$ echo "meh
" > file
[stephan@stephan] ~
$ cat file | tr -d '\n' > file ; cat file
meh