GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi (et comment) l'utilisation de Cat sur des fichiers binaires a-t-elle gâché le terminal ?

Si je comprends le cat manuel correctement :

concaténer des fichiers et imprimer sur la sortie standard

cat prendra des fichiers comme argument et les imprimera sur la sortie standard.
Ce que je n'obtiens pas, c'est si j'utilise la commande :

cat img.png > copy.png

J'obtiendrai 2 fichiers png identiques alors que si je me contente

cat img.png  

J'ai toutes les chances que mon terminal s'embrouille et interprète mal ce que je tape.

  • Comment est-ce possible ?
  • Les valeurs binaires sont toujours des données binaires. Pourquoi n'affiche-t-il pas simplement une série de 0 et 1 ou l'interprétation de ces données binaires en ASCII ou quel que soit l'encodage dans le terminal ?
  • Ce comportement est-il également possible par cat un fichier texte contenant des caractères étranges ?
  • Faut-il mettre en place un mécanisme pour empêcher ce comportement, comme l'instruction try{}catch{} ?

Réponse acceptée :

cat concatène les fichiers donnés en arguments sur la ligne de commande vers la sortie standard, il lit les octets à la fois et par défaut n'effectue aucune interprétation des octets qu'il lit.

Dans votre premier exemple, vous redirigez stdout vers un fichier, c'est pourquoi vous obtenez un nouveau fichier.

Dans votre deuxième exemple, les octets sont écrits sur le terminal, et c'est le terminal qui interprète les séquences de caractères comme des séquences de contrôle pour le terminal, c'est pourquoi vous obtenez un comportement inhabituel sur votre terminal. Cela n'a rien à voir avec cat en tant que tel, cat ne sait pas ce que vous allez faire avec sa sortie. Vous pouvez l'envoyer via un tuyau à un autre programme pour interpréter/traiter/imprimer ou jouer "Singing in the rain".

Donc, suivant la philosophie Unix,

faites une chose, faites une seule chose, mais faites-la bien

cat ne devriez pas essayer de deviner ce que vous essayez de faire.

modifier 1 réponse au 1er commentaire de @kiwy ci-dessous.

Oui et non, laissez-moi vous expliquer,

Non, si vous cat à un terminal, car il (le logiciel du terminal) envoie la sortie à votre écran ou interprète des séquences de contrôle (il émule un ancien matériel, c'est-à-dire un téléscripteur ).

mais,

Oui si vous utilisez un canal et que le programme qui le reçoit peut interpréter les caractères comme des commandes.

Connexe :Obtenir la liste de tous les fichiers par masque dans le terminal ?

regardez cat this pour un exemple, cat anyOldShellScript | bash bash interprétera ce qu'il obtient comme des commandes.


Linux
  1. Supprimer des fichiers et des dossiers dans le terminal Linux

  2. Comment chiffrer et déchiffrer des fichiers et des répertoires à l'aide de Tar et OpenSSL

  3. Comment compresser et extraire des fichiers à l'aide de la commande tar sous Linux ?

  4. wget vs curl :comment télécharger des fichiers à l'aide de wget et curl

  5. Comment vérifier le système d'exploitation et la version à l'aide d'une commande Linux

Comment synchroniser des fichiers et des répertoires à l'aide de Zaloha.sh

Comment organiser et modifier des fichiers PDF à l'aide de PDF Arranger

Comment sauvegarder des fichiers et des répertoires à l'aide de Rsync sous Linux

Comment supprimer des fichiers et des répertoires à l'aide du terminal dans Debian 10

Comment copier des fichiers et des répertoires dans un terminal Linux

Comment supprimer des fichiers et des répertoires à l'aide de la ligne de commande Linux