Warum erstellt dieser Befehl eine enorm große Datei?

19

Ich habe heute mit einigen Append-Operationen experimentiert und aus Neugier Folgendes ausgeführt (wobei file1.txt nicht leer und file2.txt leer war):

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

Als ich sah, dass es eine Weile dauerte, drücke ich Ctrl+ C, um es zu beenden. Zu diesem Zeitpunkt war file1.txt Hunderte von MB groß.

Das Wechseln der Dateinamen hat nicht den gleichen Effekt. Nur wenn sich die Dateien in dieser Reihenfolge befinden, erfolgt die unendliche Umleitung. Was genau bewirkt das?

Matt
quelle

Antworten:

24

catAuf diese Weise können Sie nicht festlegen , dass mehrere Standards verwendet werden sollen. Die letzte Umleitung hat Vorrang:

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

ist äquivalent zu:

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

Das Dateisystem füllt sich offensichtlich schnell, da die Quelldatei, die das Ziel ist, auf unbestimmte Zeit wächst und file1.txtnicht sofort gelesen werden kann.

Die meisten modernen catImplementierungen sollten die Rekursivität erkennen und abbrechen:

Solaris-Katze:

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

Gnu Katze:

cat: file1.txt: input file is output file

Sie können sowieso mit etwas getäuscht werden:

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

Ein schöner nicht so unnützer Einsatz von Katzen ...

jlliagre
quelle
19
Das sind viele Katzen, Miau.
slm
2
Du hast mir den Kopf verdreht, aber du hast meine Frage beantwortet!
Matt
7
Und als ich auf Google+ danach gefragt habe (keine Antwort erhalten), hat es meinen Beitrag automatisch mit #Cat und #Caturday
Matt,
3

Ich konnte dies nicht in einer Bash-Shell reproduzieren:

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

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

1 Datei wird mit 0 Länge erstellt, aber dann erhalte ich die obige Meldung:

$ 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

Aufgrund der Antwort von @ jlliagre bin ich mir nicht sicher, warum ich die 2 Dateien bekomme. Dies kann von der catImplementierung abhängen .

EDIT # 1

@jlliagre hat seine Antwort aktualisiert, um diesen Code anzuzeigen, den er als äquivalent angibt:

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

Jetzt weiß ich, warum ich die leeren bekomme file2.txt. Diese Notation ist legal:

>> file2.txt

Und wird eine leere Datei erstellen.

slm
quelle
Versuchen Sie es erneut mit file1.txteinem nicht leeren Start.
Gilles 'SO- hör auf böse zu sein'
@Gilles - Ich habe das gerade noch einmal gelesen und es bemerkt, sollte ich etwas anderes sehen, bekomme ich trotzdem den Fehler? Oder sagst du nur, dass b / c das Beispiel in meiner Antwort falsch ist? Ich habe die Antwort übrigens korrigiert.
slm
@Gilles - das war deine Ablehnung, nein? Ist es nur für etwas Bestimmtes oder mangelnden Wert der Antwort?
slm
1
Ich bin nicht sicher, warum Ihre Antwort
abgelehnt
+1; danke für dein experimentieren! Ich fange an, Weiterleitungen und catVerhalten besser zu verstehen .
Matt