GNU/Linux >> Linux Esercitazione >  >> Linux

Perché (e come) l'uso di Cat su file binari ha rovinato il terminale?

Se ho capito il cat manuale correttamente:

concatena i file e stampa sullo standard output

cat prenderà i file come argomento e li stamperà sullo standard output.
Quello che non ottengo è se uso il comando:

cat img.png > copy.png

Otterrò 2 file png identici mentre se solo

cat img.png  

Ho tutte le possibilità che il mio terminale si incasini e interpreti erroneamente ciò che scrivo.

  • Com'è possibile?
  • I valori binari sono ancora dati binari. Perché non mostra semplicemente una serie di 0 e 1 o l'interpretazione di quei dati binari in ASCII o qualunque sia la codifica nel terminale?
  • Questo comportamento è possibile anche da cat ing un file di testo contenente strani caratteri?
  • Dovrebbe essere implementato un meccanismo per prevenire questo comportamento come l'istruzione try{}catch{}?

Risposta accettata:

cat concatena i file forniti come argomenti sulla riga di comando allo standard output, legge i byte alla volta e come impostazione predefinita non esegue alcuna interpretazione dei byte che legge.

Nel tuo primo esempio stai reindirizzando stdout a un file, ecco perché ottieni un nuovo file.

Nel tuo secondo esempio i byte vengono scritti sul terminale, ed è il terminale che interpreta sequenze di caratteri come sequenze di controllo per il terminale, ecco perché ottieni un comportamento insolito sul tuo terminale. Non ha nulla a che fare con cat in quanto tale, cat non sa cosa farai con il suo output. Potresti inviarlo tramite una pipe a un altro programma per interpretare/elaborare/stampare o riprodurre "Singing in the rain".

Quindi, seguendo la filosofia unix,

fai una cosa, fai una cosa sola, ma falla bene

cat non dovrebbe tentare di indovinare cosa stai cercando di fare.

modifica 1 risposta al 1° commento di @kiwy di seguito.

Sì e No, lasciatemi spiegare,

No, se cat a un terminale, perché (il software del terminale) sta inviando l'output al tuo schermo o interpretando sequenze di controllo (sta emulando un vecchio pezzo di hardware, ad es. un dispositivo di telescrivente ).

ma,

Sì, se vai su una pipe e il programma che riceve può interpretare i caratteri come comandi.

Correlati:ottieni l'elenco di tutti i file per maschera nel terminale?

look cat this per un esempio, cat anyOldShellScript | bash bash interpreterà ciò che ottiene come comandi.


Linux
  1. Rimuovere file e cartelle nel terminale Linux

  2. Come crittografare e decrittografare file e directory utilizzando Tar e OpenSSL

  3. Come comprimere ed estrarre file usando il comando tar su Linux?

  4. wget vs curl:come scaricare file usando wget e curl

  5. Come controllare il sistema operativo e la versione utilizzando un comando Linux

Come sincronizzare file e directory utilizzando Zaloha.sh

Come organizzare e modificare i file PDF utilizzando PDF Arranger

Come eseguire il backup di file e directory utilizzando Rsync in Linux

Come eliminare file e directory utilizzando il terminale in Debian 10

Come copiare file e directory nel terminale Linux

Come eliminare file e directory utilizzando la riga di comando di Linux