Wenn ich das cat
Handbuch richtig verstehe :
Dateien verketten und auf der Standardausgabe drucken
cat
nimmt 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
cat
eine Textdatei mit seltsamen Zeichen möglich? - Sollte ein Mechanismus implementiert werden, um dieses Verhalten wie die Anweisung try {} catch {} zu verhindern?
reset
Befehl kann manchmal helfen, aber dies ist keine Wunderlösung.reset
und einemreset
zwischen Strg-J-Tastendruck? Ich kann keinen sehen (noch einen Grund, den komplizierteren Weg zu gehen)Antworten:
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
,cat
weiß 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,
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
cat
zu 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 | bash
Bash interpretiert das, was es erhält, als Befehle.quelle
cat
eine Binärdatei, die möglicherweise einerm -rf .
solche Klartextanweisung enthält , interpretiert werden könnte?echo
sie bei Bedarf ausgeben. Siehe stackoverflow.com/questions/5947742/… für die Vorgehensweise und Termsys.demon.co.uk/vtansi.htm für einige der möglichenIch 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.
quelle