Perché questo comando crea un file enormemente grande?


19

Oggi stavo sperimentando alcune operazioni di aggiunta e, nella mia curiosità, ho eseguito questo (dove file1.txt non era vuoto e file2.txt era vuoto):

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

Quando l'ho visto impiegare un po ', ho premuto Ctrl+ Cper terminarlo. A quel punto, file1.txt aveva dimensioni di centinaia di MB.

Il cambio dei nomi dei file non produce lo stesso effetto; solo quando i file sono in questo ordine si verifica il reindirizzamento infinito. Cosa sta succedendo esattamente ciò che causa questo?

Risposte:


24

Non puoi dire catdi usare più standard in questo modo, l'ultimo reindirizzamento ha la precedenza quindi:

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

è equivalente a:

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

che ovviamente riempie rapidamente il file system, dato che anche il file sorgente essendo la destinazione cresce indefinitamente, a condizione che file1.txtsia abbastanza grande da non essere letto immediatamente.

Le catimplementazioni più moderne dovrebbero rilevare la ricorsività e interrompere:

Gatto Solaris:

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

Gatto Gnu:

cat: file1.txt: input file is output file

Possono essere ingannati comunque con qualcosa del tipo:

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

Un bell'uso non così inutile di gatti ...


19
Sono un sacco di gatti, miao.
slm

2
Mi hai fatto girare la testa ma hai risposto alla mia domanda!
Matt

7
E quando ho chiesto questo su Google+ (non ho ricevuto risposta), ha automaticamente taggato il mio post con #Cat e #Caturday
Matt

3

Non sono riuscito a riprodurlo in una shell Bash:

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

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

Viene creato 1 file con lunghezza 0 ma viene visualizzato il messaggio sopra:

$ 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

Sulla base della risposta di @ jlliagre non sono sicuro del motivo per cui sto ricevendo i 2 file. Potrebbe dipendere catdall'implementazione.

EDIT # 1

@jlliagre ha aggiornato la sua risposta per mostrare questo codice che afferma equivalente:

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

Quindi ora so perché sto ottenendo il vuoto file2.txt. Questa notazione è legale:

>> file2.txt

E creerà un file vuoto.


Riprovare con l' file1.txtavvio non vuoto.
Gilles 'SO- smetti di essere malvagio' il

@Gilles - L'ho appena riletto e l'ho notato, dovrei vedere qualcosa di diverso, ho ancora l'errore? O stai solo dicendo che b / c l'esempio nella mia risposta è sbagliato? Ho corretto la risposta BTW.
slm

@Gilles - quello era il tuo voto negativo, no? È solo per qualcosa di specifico o la mancanza di valore della risposta?
slm

1
Non sono sicuro del motivo per cui la tua risposta è stata annullata, +1 per aver sperimentato prima di rispondere, qualcosa che non ho fatto da solo ...
jlliagre,

+1; grazie per la tua sperimentazione! Sto iniziando a capire meglio reindirizzamenti e catcomportamento.
Matt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.