¿Por qué no puedo guardar mi salida en un archivo desde un comando que toma la entrada como el archivo mismo?

¿Por qué no puedo guardar mi salida en un archivo desde un comando que toma la entrada como el archivo mismo?

Por ejemplo, aquí está mi comando que estoy usando:

tr -d '\n' < newfile.ppm 

Quiero enviar los resultados exactamente a ese mismo archivo, así que ahora estoy haciendo:

tr -d '\n' < newfile.ppm > newfile.ppm

¿Por qué esto no funciona y cómo puedo hacer que funcione?

Respuesta1

Este es un "te pillé" extremadamente común.

Cuando redirige stdout o stderr para escribir en un archivo, el shell primero truncará el archivo para prepararlo para la escritura. Entonces lo que está ocurriendo es más o menos lo siguiente:

  1. Su shell establece stdin ennewfile.ppm
  2. Su shell se trunca newfile.ppma la longitud 0
  3. Su shell establece stdout ennewfile.ppm
  4. Tu shell se ejecuta tr -d '\n'. Como puedes ver, en este punto, el contenido de newfile.ppmya desapareció, por lo que no hay nada que leer.

Para solucionar este problema, simplemente envíelo a otro archivo. Luego puedes cambiarle el nombre

Respuesta2

Esto hará el trabajo que deseas.

[stephan@stephan] ~ 
$ echo "meh                                    
" > file
[stephan@stephan] ~ 
$ cat file | tr -d '\n' > file ; cat file 
meh

información relacionada