Por que não consigo salvar minha saída em um arquivo a partir de um comando que recebe a entrada como o próprio arquivo?

Por que não consigo salvar minha saída em um arquivo a partir de um comando que recebe a entrada como o próprio arquivo?

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:

  1. Seu shell define stdin paranewfile.ppm
  2. Seu shell é truncado newfile.ppmpara comprimento 0
  3. Seu shell define stdout comonewfile.ppm
  4. Seu shell é executado tr -d '\n'. Como você pode ver, neste ponto o conteúdo newfile.ppmjá 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

informação relacionada