¿Por qué este command crea un file enormemente grande?

Estaba experimentando hoy con algunas operaciones de adición y, en mi curiosidad, ejecuté esto (donde el file1.txt no estaba vacío y el file2.txt estaba vacío):

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

Cuando lo vi demorar un poco, presioné Ctrl + C para finalizarlo. Para entonces, file1.txt tenía cientos de MB de tamaño.

Cambiar los nombres de los files no produce el mismo efecto; solo cuando los files están en este order ocurre la networkingirección infinita. ¿Qué está sucediendo exactamente que causa esto?

No puede decirle a cat que use múltiples estándares de esa manera, la última networkingirección tiene prioridad así 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 files, dado el hecho de que el file fuente que es el destino también crece indefinidamente siempre que el file1.txt sea ​​lo suficientemente grande como para no ser leído a la vez.

La mayoría de las implementaciones de cat modernos deberían detectar la recursion y abortar:

Gato de Solaris:

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

Gnu cat:

 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 y no tan inútil uso de gatos …

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 file con longitud 0 pero luego aparece el post 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 

Basado en la respuesta de @ jlliagre, no estoy seguro de por qué obtengo los 2 files. Puede depender de la implementación del cat .

EDIT # 1

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

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

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

 >> file2.txt 

Y creará un file vacío.