Warum (und wie) hat die Verwendung von cat für Binärdateien das Terminal durcheinander gebracht?

8

Wenn ich das catHandbuch richtig verstehe :

Dateien verketten und auf der Standardausgabe drucken

catnimmt Dateien als Argument und druckt sie in der Standardausgabe.
Was ich nicht bekomme, ist, wenn ich den Befehl benutze:

cat img.png > copy.png

Ich werde 2 PNG-Dateien erhalten, die identisch sind, wenn ich nur

cat img.png  

Ich habe alle Chancen, dass mein Terminal durcheinander gerät und meine Eingabe falsch interpretiert.

  • Wie ist das möglich?
  • Binärwerte sind immer noch Binärdaten. Warum zeigt es nicht einfach eine Reihe von 0 und 1 oder die Interpretation dieser Binärdaten in ASCII oder was auch immer die Codierung im Terminal ist?
  • Ist dieses Verhalten auch durch cateine Textdatei mit seltsamen Zeichen möglich?
  • Sollte ein Mechanismus implementiert werden, um dieses Verhalten wie die Anweisung try {} catch {} zu verhindern?
Kiwy
quelle
2
Ihr Terminal wird nicht durcheinander gebracht. Es befindet sich in einem Zustand, in den Sie es gezwungen haben, indem Sie ihm Steuerzeichen gesendet haben. Dass Sie es nach einer Änderung des Status nicht mehr verwenden können, ist möglicherweise nicht das, was Sie wollten, aber es ist ausschließlich darauf zurückzuführen, dass Sie die Konsequenzen Ihrer Handlungen nicht verstehen. Dies ist dasselbe, als würden Sie Ihre Schriftfarbe in einem Textverarbeitungsprogramm auf Grün umstellen und sagen, dass Ihr Textverarbeitungsprogramm durcheinander ist, nur weil Sie nicht wissen, wie Sie es wieder auf schwarze Schrift umstellen können, ohne z. B. das Programm zu beenden.
Anthon
4
Ein resetBefehl kann manchmal helfen, aber dies ist keine Wunderlösung.
Ouki
Die tatsächlich einzugebende Sequenz ist Control-J Reset Control-J. Stellt fast immer die geistige Gesundheit wieder her.
Joshua
1
@ Joshua Und was ist der Unterschied zwischen einem einsamen resetund einem resetzwischen Strg-J-Tastendruck? Ich kann keinen sehen (noch einen Grund, den komplizierteren Weg zu gehen)
Syntaxfehler
1
Wenn das Terminal im RAW-Modus belassen wurde, generiert Enter Strg-M anstelle von Strg-J, sodass die Shell nicht den erforderlichen Tastendruck sieht, um eine Zeile zu beenden und den Befehl auszuführen.
Joshua

Antworten:

8

cat Verkettet Dateien, die als Argumente in der Befehlszeile angegeben wurden, mit der Standardausgabe. Sie liest jeweils Bytes und führt standardmäßig keine Interpretation der gelesenen Bytes durch.

In Ihrem ersten Beispiel leiten Sie stdout in eine Datei um. Deshalb erhalten Sie eine neue Datei.

In Ihrem zweiten Beispiel werden die Bytes in das Terminal geschrieben, und es ist das Terminal, das Zeichenfolgen als Steuersequenzen für das Terminal interpretiert. Aus diesem Grund erhalten Sie ungewöhnliches Verhalten auf Ihrem Terminal. Es hat nichts damit zu tun cat, catweiß nicht, was Sie mit seiner Ausgabe machen werden. Sie können es über eine Pipe an ein anderes Programm senden, um "Singing in the rain" zu interpretieren / zu verarbeiten / zu drucken oder zu spielen.

Also der Unix-Philosophie folgend,

Mach eine Sache, mach nur eine Sache, aber mach es gut

cat sollte nicht versuchen, zu erraten, was Sie versuchen zu tun.

1 Antwort auf @ kiwys ersten Kommentar unten bearbeiten.

Ja und Nein, lassen Sie mich erklären,

Nein, wenn Sie catzu einem Terminal gehen, weil es (die Terminalsoftware) die Ausgabe an Ihren Bildschirm sendet oder Steuersequenzen interpretiert (es emuliert eine alte Hardware, dh ein Teletypgerät ).

aber,

Ja, wenn Sie sich an eine Pipe wenden und das empfangende Programm die Zeichen als Befehle interpretieren kann.

Schauen Sie sich dies als Beispiel an. cat anyOldShellScript | bashBash interpretiert das, was es erhält, als Befehle.

X Tian
quelle
Bedeutet dies, dass cateine Binärdatei, die möglicherweise eine rm -rf .solche Klartextanweisung enthält , interpretiert werden könnte?
Kiwy
Ich akzeptiere die Antwort, obwohl ich nicht wirklich verstehe, warum das Terminal so durcheinander geraten kann, wenn ich wie Dummkopf auf meiner Tastatur tippe. Ich bekomme das nie: D
Kiwy
Und jetzt Ironie ... Brummen
Kiwy
1
@ Kiwy-Steuerzeichen sind auf Ihrer Tastatur nicht vorhanden, aber Sie können echosie bei Bedarf ausgeben. Siehe stackoverflow.com/questions/5947742/… für die Vorgehensweise und Termsys.demon.co.uk/vtansi.htm für einige der möglichen
David Wilkins
@ DavidWilkins hey danke das ist schön, so viel zu lernen und keine Zeit dafür :-(
Kiwy
2

Ich denke, dies geschieht hauptsächlich aufgrund nicht druckbarer Zeichen mit Codes unter 0x20. Dies sind spezielle Steuer- / Escape-Codes, die für Tasten wie Rücktaste, Löschen usw. verwendet werden.

UVV
quelle