Si entiendo el cat
manual correctamente:
concatenar archivos e imprimir en la salida estándar
cat
tomará los archivos como argumento y los imprimirá en la salida estándar.
Lo que no obtengo es si uso el comando:
cat img.png > copy.png
Obtendré 2 archivos png idénticos mientras que si solo
cat img.png
Tengo todas las posibilidades de que mi terminal se estropee y malinterprete lo que escribo.
- ¿Cómo es eso posible?
- Los valores binarios siguen siendo datos binarios. ¿Por qué no muestra simplemente una serie de 0 y 1 o la interpretación de esos datos binarios en ASCII o cualquiera que sea la codificación en la terminal?
- ¿Este comportamiento también es posible por parte de
cat
? ing un archivo de texto que contiene caracteres extraños? - ¿Debería implementarse un mecanismo para evitar este comportamiento, como la instrucción try{}catch{}?
Respuesta aceptada:
cat
concatena los archivos proporcionados como argumentos en la línea de comandos a la salida estándar, lee los bytes a la vez y, de forma predeterminada, no realiza ninguna interpretación de los bytes que lee.
En su primer ejemplo, está redirigiendo stdout a un archivo, por eso obtiene un nuevo archivo.
En su segundo ejemplo, los bytes se escriben en la terminal, y es la terminal la que interpreta secuencias de caracteres como secuencias de control para la terminal, por eso obtiene un comportamiento inusual en su terminal. No tiene nada que ver con cat
como tal, cat
no sabe qué vas a hacer con su salida. Podría estar enviándolo a través de una tubería a otro programa para interpretar/procesar/imprimir o reproducir "Cantando bajo la lluvia".
Entonces, siguiendo la filosofía de Unix,
haz una cosa, haz una sola cosa, pero hazla bien
cat
no debe intentar adivinar lo que está tratando de hacer.
edite 1 respuesta al primer comentario de @kiwy a continuación.
Sí y No, déjame explicarte,
No, si cat
a una terminal, porque (el software de la terminal) está enviando la salida a su pantalla o interpretando secuencias de control (está emulando una pieza antigua de hardware, es decir, un dispositivo de teletipo ).
pero,
Sí, si conecta una tubería y el programa que recibe puede interpretar los caracteres como comandos.
Relacionado:¿Obtener una lista de todos los archivos por máscara en la terminal?
mire cat esto para ver un ejemplo, cat anyOldShellScript | bash
bash interpretará lo que obtiene como comandos.