Katzenumleitung

11

Angenommen, eine aufgerufene Datei abcbefindet sich im aktuellen Verzeichnis und enthält Text. Wenn Sie den Befehl ausführen:

cat abc > abc

Warum abcverschwindet der Inhalt der Datei ?
Warum löscht der Befehl den darin enthaltenen Text und die Datei wird zu einer leeren Datei?

Tulsi Kanodia
quelle
Lösungen finden Sie unter Kann ich cuteine Datei an Ort und Stelle ändern?
Gilles 'SO - hör auf böse zu sein'
10
Ein Laserpointer ist ein sehr effektives Werkzeug für die Katzenumleitung. </ pun>
WBT
Meine Katze reagiert sehr schlecht auf Umleitung ...
Ex Umbris
Um dieses Problem zu vermeiden, verwende ich ein kleines Shellscript, das ich Hund nannte :cat abc | dog abc
joeytwiddle
Eine andere Option, wenn Sie die Ausgabe auf dem Bildschirm nicht stören, ist die Verwendung tee.
Andrea Lazzarotto

Antworten:

27

Wegen der Reihenfolge, wie die Dinge gemacht werden.

Wenn Sie das tun:

cat abc > abc

>ist der Umleitungsoperator für die Ausgabe. Wenn die Shell dies sieht, öffnet sie die Datei im Kürzungsmodus mit dem O_TRUNCFlag mit open(2)dh open("abc", O_TRUNC), sodass alles, was in der Datei vorhanden war, nicht mehr vorhanden ist. Beachten Sie, dass diese Umleitung zuerst von der Shell durchgeführt wird, bevor der catBefehl ausgeführt wird.

Wenn der Befehl cat abcausgeführt wird, ist die Datei abcbereits abgeschnitten, sodass catdie Datei leer ist.

heemayl
quelle
1
Was ist mit Katze abc >> abc? Was passiert dann?
Tulsi Kanodia
2
@TulsiKanodia - das verursacht eine Endlosschleife. Jedes Mal, wenn eine Katze eine Zeile liest, wird eine weitere angehängt, bevor zur nächsten übergegangen wird.
user3490
3
Dies wird erkannt und verhindert. Stattdessen wird der Text cat: filename: input file is output file(wo filenameist der von Ihnen gewählte Dateiname) auf dem alten Standard gedruckt.
UTF-8
@TulsiKanodia Siehe unix.stackexchange.com/questions/154903/why-does-cat-xx-loop
Gilles 'SO- hör auf böse zu sein'
5

Wenn Sie der Antwort von @ heemayl hinzufügen möchten, dass der Code klarer über die Reihenfolge ist, in der die Dinge geschehen, können Sie einfach die Umleitungen am Anfang des Befehls einfügen:

> abc cat abc
l0b0
quelle