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


8

Se capisco catcorrettamente il manuale:

concatena i file e stampa sull'output standard

catprenderà i file come argomento e li stamperà sull'output standard.
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 venga incasinato e che fraintenda 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 catinging un file di testo contenente strani caratteri?
  • Dovrebbe essere implementato un meccanismo per prevenire questo comportamento come l'istruzione try {} catch {}?

2
Il tuo terminale non viene incasinato. È in uno stato in cui lo hai forzato inviandogli i personaggi di controllo. Il fatto di non poterlo più utilizzare dopo aver cambiato lo stato potrebbe non essere quello che volevi, ma è interamente il risultato della tua non comprensione delle conseguenze delle tue azioni. Questo sarebbe lo stesso di passare il colore del carattere al verde in un word processor e dire il vostro word processor è incasinato, solo perché tu non sai come passare di nuovo a carattere nero, senza per esempio uscire dal programma.
Anthon,

4
un resetcomando potrebbe aiutare a volte, ma questa non è una soluzione miracolosa.
Ouki,

La sequenza effettiva da digitare è Control-J reset Control-J. Ripristina quasi sempre la sanità mentale.
Joshua,

1
@Joshua E qual è la differenza tra una pressione sola resete una resettra i tasti Ctrl-J? Non riesco a vedere alcun (né alcun motivo per andare nel modo più complicato)
syntaxerror

1
Perché se il terminale è stato lasciato in modalità RAW, Enter genera Ctrl-M invece di Ctrl-J, quindi la shell non vede la sequenza di tasti necessaria per terminare una riga ed eseguire il comando.
Joshua,

Risposte:


8

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 sono scritti sul terminale, ed è il terminale che interpreta le 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 cattale, catnon sa cosa farai con il suo output. Potresti inviarlo tramite una pipe ad un altro programma per interpretare / elaborare / stampare o suonare "Cantando sotto la pioggia".

Quindi seguendo la filosofia unix,

fai una cosa, fai solo una cosa, ma fallo bene

cat non dovresti provare a indovinare cosa stai cercando di fare.

modifica 1 risposta al primo commento di @ kiwy qui sotto.

Sì e No, lasciami spiegare,

No, se si catarriva a un terminale, perché (il software del terminale) sta inviando l'output sullo schermo o interpretando le sequenze di controllo (emula un vecchio componente hardware, ad esempio un dispositivo di teletipo ).

ma,

Sì, se ci si collega a una pipe e il programma ricevuto può interpretare i caratteri come comandi.

guarda questo per esempio, cat anyOldShellScript | bashbash interpreterà ciò che ottiene come comandi.


significa che se si catpossono rm -rf .interpretare file binari che possono contenere istruzioni in testo normale come questo?
Kiwy,

Accetto la risposta, anche se non capisco perché il terminale può incasinarsi in questo modo se digito come un idiota sulla tastiera non riesco mai a ottenere questo: D
Kiwy

E ora ironia ... ronzio
Kiwy

1
I caratteri di controllo di @Kiwy non esistono sulla tastiera, ma puoi echocrearli se lo desideri. Vedi stackoverflow.com/questions/5947742/… per come farlo e termsys.demon.co.uk/vtansi.htm per alcuni di ciò che è possibile
David Wilkins

@DavidWilkins hey grazie è bello, tante cose da imparare e non c'è tempo per questo :-(
Kiwy

2

Immagino che ciò accada principalmente a causa di caratteri non stampabili con codici inferiori a 0x20. Questi sono codici speciali di controllo / escape, che vengono utilizzati per tasti come Backspace, Elimina, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.