Wenn ich die cat
verstehe Handbuch richtig:
Dateien verketten und auf der Standardausgabe ausgeben
cat
nimmt Dateien als Argument und gibt sie auf der Standardausgabe aus.
Was ich nicht bekomme, ist, wenn ich den Befehl verwende:
cat img.png > copy.png
Ich erhalte 2 identische PNG-Dateien, wenn ich nur
cat img.png
Es besteht die Möglichkeit, dass mein Terminal durcheinander kommt und meine Eingabe falsch interpretiert.
- Wie ist das möglich?
- Binäre Werte sind immer noch binäre Daten. 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 bei
cat
möglich eine Textdatei mit seltsamen Zeichen? - Sollte ein Mechanismus wie die try{}catch{}-Anweisung implementiert werden, um dieses Verhalten zu verhindern?
Akzeptierte Antwort:
cat
verkettet Dateien, die als Argumente auf der Kommandozeile zur Standardausgabe gegeben wurden, es liest Bytes auf einmal 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 tritt auf Ihrem Terminal ein ungewöhnliches Verhalten auf. Es hat nichts mit cat
zu tun also cat
weiß nicht, was Sie mit seiner Ausgabe machen werden. Möglicherweise senden Sie es über eine Pipe an ein anderes Programm, um „Singing in the rain“ zu interpretieren/verarbeiten/drucken oder abzuspielen.
Also nach der Unix-Philosophie,
Mach nur eine Sache, mach nur eine Sache, aber mach es gut
cat
sollten nicht versuchen, zu erraten, was Sie zu tun versuchen.
Bearbeite 1 Antwort auf den ersten Kommentar von @kiwy unten.
Ja und Nein, lass es mich erklären,
Nein, wenn Sie cat
sind an ein Terminal, weil es (die Terminalsoftware) die Ausgabe an Ihren Bildschirm sendet oder Steuersequenzen interpretiert (es emuliert ein altes Stück Hardware, z. B. ein Fernschreibgerät ).
aber,
Ja, wenn Sie an eine Pipe kategorisieren und das empfangende Programm die Zeichen als Befehle interpretieren kann.
Verwandt:Liste aller Dateien nach Maske im Terminal abrufen?
siehe cat this für ein Beispiel, cat anyOldShellScript | bash
bash wird das, was es erhält, als Befehle interpretieren.