¿Por qué este comando crea un archivo enormemente grande?


19

Hoy estaba experimentando con algunas operaciones de agregar y, por curiosidad, ejecuté esto (donde file1.txt no estaba vacío y file2.txt estaba vacío):

$ cat file1.txt >> file2.txt >> file1.txt

Cuando lo vi tomar un tiempo, presioné Ctrl+ Cpara finalizarlo. Para entonces, file1.txt tenía un tamaño de cientos de MB.

Cambiar los nombres de archivo no produce el mismo efecto; solo cuando los archivos están en este orden se produce la redirección infinita. ¿Qué está sucediendo exactamente que causa esto?

Respuestas:


24

No puede decir catque use múltiples estándares de esa manera, la última redirección tiene prioridad, por lo que:

cat file1.txt >> file2.txt >> file1.txt

es equivalente a:

>> file2.txt ; cat file1.txt >> file1.txt

que obviamente llena rápidamente el sistema de archivos, dado que el archivo de origen que es el destino también crece indefinidamente siempre que file1.txtsea ​​lo suficientemente grande como para no ser leído de inmediato.

La mayoría de las catimplementaciones modernas deberían detectar la recursividad y abortar:

Gato Solaris:

cat: input/output files 'file1.txt' identical

Gato ñu:

cat: file1.txt: input file is output file

Pueden ser engañados de todos modos con algo como:

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt

Un buen uso no tan inútil de los gatos ...


19
Son muchos gatos, miau.
slm

2
¡Me hiciste girar la cabeza pero respondiste mi pregunta!
Matt

77
Y cuando pregunté sobre esto en Google+ (no obtuve una respuesta), etiquetó automáticamente mi publicación con #Cat y #Caturday
Matt

3

No pude reproducir esto en un shell Bash:

# non-empty file1
$ echo 1 > file1.txt

$ cat file1.txt >> file2.txt >> file1.txt 
cat: file1.txt: input file is output file

Se crea 1 archivo con longitud 0 pero luego aparece el mensaje anterior:

$ ls -l
total 4
-rw-rw-r-- 1 saml saml   2 Sep 10 19:35 file1.txt
-rw-rw-r-- 1 saml saml   0 Sep 10 19:35 file2.txt

Según la respuesta de @ jlliagre, no estoy seguro de por qué obtengo los 2 archivos. Puede depender de la catimplementación.

EDITAR # 1

@jlliagre actualizó su respuesta para mostrar este código que afirma como equivalente:

>> file2.txt ; cat file1.txt >> file1.txt

Así que ahora sé por qué estoy obteniendo el vacío file2.txt. Esta notación es legal:

>> file2.txt

Y creará un archivo vacío.


Intente nuevamente con file1.txtcomenzar no vacío.
Gilles 'SO- deja de ser malvado'

@Gilles - Acabo de volver a leer eso y lo noté, ¿debería ver algo diferente, todavía recibo el error? ¿O simplemente estás diciendo que b / c el ejemplo en mi respuesta es incorrecto? Arreglé la respuesta por cierto.
slm

@Gilles: ese fue tu voto negativo, ¿no? ¿Es solo por algo específico o falta de valor de la respuesta?
slm

1
No sé por qué su respuesta fue rechazada, 1 para experimentar antes de contestar, algo que no hice yo ...
jlliagre

+1; gracias por tu experimentación! Estoy empezando a comprender mejor las redirecciones y el catcomportamiento.
Matt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.