¿Por qué la redirección al mismo archivo trunca el archivo?

11

Normalmente usamos un archivo diferente para redirigir la salida.

Por ejemplo :

cat < first > temp

En este comando, el contenido de first se redirige a temp en lugar de a la salida estándar.

Entonces, ¿por qué trunca el archivo si uso el mismo nombre de archivo?

¿Por qué no puede sobrescribir el mismo archivo?

cat < first > first 
Searock
fuente

Respuestas:

19

Cuando utiliza la redirección de E / S de esa manera, el shell abre tanto el archivo de "entrada" como el de "salida" antes de ejecutar el comando. Y abrir un archivo para sobrescribirlo es lo mismo que truncarlo antes de escribir. El resultado: catve un archivo vacío en la entrada ...

JanC
fuente
0

Porque manejarlo en el caso general sería muy complicado. Solo considere el siguiente ejemplo:

Un programa lee un archivo línea por línea y genera cada línea dos veces. Ahora, para que esto funcione sin un segundo archivo (es decir, en el mismo archivo), el programa necesitaría almacenar en búfer la mayoría (todas) de las líneas que leerá, ya que de lo contrario se sobrescribirán antes de que puedan leerse.

Para mantener las cosas simples, los programas usualmente usan un archivo secundario secundario que mueven sobre el original una vez que han terminado. Así es, por ejemplo, cómo funciona sed -i(en línea).

Pantera gris
fuente
0

Normalmente, la sintaxis para redirigir en este caso debería ser cat first > temp. Esto significa que catla salida de firstse envía al archivo de temp. En el caso de su estado de cuenta cat < first > temp, la salida catno se ha completado en el momento en que se redirige a salir nuevamente. Nada en resultados en nada fuera.

Sin embargo, catcrear un archivo y la salida redirigida a otro archivo no es diferente a un básico cp.

Casey Keller
fuente
cat < first > tempfunciona bien
JanC