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.