GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum (und wie) hat die Verwendung von Cat auf Binärdateien das Terminal durcheinander gebracht?

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.


Linux
  1. Entfernen Sie Dateien und Ordner im Linux-Terminal

  2. So verschlüsseln und entschlüsseln Sie Dateien und Verzeichnisse mit Tar und OpenSSL

  3. Wie komprimiert und extrahiert man Dateien mit dem tar-Befehl unter Linux?

  4. wget vs curl:So laden Sie Dateien mit wget und curl herunter

  5. So überprüfen Sie das Betriebssystem und die Version mit einem Linux-Befehl

So synchronisieren Sie Dateien und Verzeichnisse mit Zaloha.sh

So ordnen und ändern Sie PDF-Dateien mit PDF Arranger

So sichern Sie Dateien und Verzeichnisse mit Rsync unter Linux

So löschen Sie Dateien und Verzeichnisse mit dem Terminal in Debian 10

So kopieren Sie Dateien und Verzeichnisse im Linux-Terminal

So löschen Sie Dateien und Verzeichnisse mit der Linux-Befehlszeile