cat (Unix)
cat, qui vient de l'anglais catenate, synonyme de concatenate (soit : « concaténer »), est une commande Unix standard permettant de concaténer des fichiers ainsi que d'afficher leur contenu sur la sortie standard — habituellement un terminal Unix ; le plus souvent des « shells », notamment Bash, zsh, Csh, etc.
Pour les articles homonymes, voir Cat.
tac (en) est l'équivalent de cat mais affiche le contenu d'un fichier de la fin au début.
Dans les systèmes Microsoft, son équivalent est la commande type (en).
Exemples
Pour visualiser un fichier :
cat fichier.txt
Pour visualiser deux fichiers concaténés :
cat fichier1.txt fichier2.txt
Spécifications
Les "Single UNIX Specification" (spécifications du standard UNIX) ont déterminé que le comportement de la commande serait d'afficher le contenu de chacun des fichiers donnés en argument sur la sortie standard en une seule et même séquence. Utilisée avec l'option "-u" (non utilisée par la version GNU), cette commande affiche chaque octet (byte en anglais) dès qu'il est lu, sans utiliser de mémoire tampon (buffer).
Si l'option "-" est appliquée, cat lira l'entrée standard (exemple : clavier) et l'affichera dans la séquence de sortie. S'il n'y a aucun fichier en argument, cat lira à partir de l'entrée standard.
cat permet donc l'affichage rapide et passif du contenu d'un fichier.
Différentes erreurs peuvent être rencontrées :
- Permission denied (si l'utilisateur n'a pas le droit de lire le fichier)
- Is a directory (si l'utilisateur tente de lire un dossier)
- Operation not supported (si l'action est impossible pour tout autre raison)
Extensions
Les deux versions BSD et la version GNU coreutils de cat supportent les options suivantes :
- -b (GNU seulement : --number-nonblank), numéroter les lignes non-blanches en sortie.
- -n (GNU seulement : --number), numéroter les lignes en sortie.
- -s (GNU seulement : --squeeze-blank), fusionne en une seule toutes les lignes blanches qui se suivent.
- -v (GNU seulement : --show-nonprinting), affiche les caractères non-imprimables comme s'ils étaient visibles à l'exception des tabulations et des caractères de fin de ligne (EOL : End Of Line).
- -t avec BSD ou -T avec GNU, a le même comportement que -v mais affiche aussi les tabulations sous forme de ^I.
- -e avec BSD ou -E avec GNU, a le même comportement que -v mais affiche aussi les caractères de fin de ligne sous la forme $.
Un peu de culture Unix
Définition du Jargon File
Le « Jargon File », dans sa version 4.3.3, définit la commande cat comme suit :
- Sert à afficher, sans s'arrêter, un fichier entier à l'écran ou sur une autre sortie standard.
- Par extension, sert à envoyer une grande quantité de données à une cible non préparée ou n'ayant pas l'intention de les lire soigneusement. La commande est donc considérée comme limitée.
Pour les fans d'Unix, cat est considéré comme un excellent exemple de ce qu'est une conception « User-interface » parce que, d'une part, elle donne le contenu du fichier sans caractère complément inopiné comme une espace ou des séparateurs entre les fichiers et, d'autre part, elle ne nécessite pas que le fichier soit constitué de lignes de texte mais fonctionne avec n'importe quel type de donnée.
Pour les détracteurs d'Unix, cat est considéré comme l'archétype d'une mauvaise conception « User-interface » car son nom est particulièrement mal choisi. En effet, cette commande est bien plus utilisée pour afficher un unique fichier sur la sortie standard que pour concaténer plusieurs fichiers. De fait, le nom cat est donc aussi non-intuitif que le nom de la commande cdr en Lisp par exemple qui, elle, a pour but d'extraire un pointeur.
Cat et UUOC
UUOC, extrait de comp.unix.shell sur Usenet, signifie « Useless Use of cat » (soit : utilisation inutile de cat). Comme certains de comp.unix.shell le firent remarquer, le but de la commande cat est de concaténer des fichiers. Si elle est utilisée sur seulement un fichier, c'est une perte de temps et un surcoût inutile de ressources : « The purpose of cat is to concatenate (or 'catenate') files. If it's only one file, concatenating it with nothing at all is a waste of time, and costs you a process »
Exemples d'UUOC
On voit faire :
cat file | autres_commandes avec leurs arguments
au lieu de :
<file autres_commandes avec leurs arguments
ou plus classiquement :
autres_commandes avec leurs arguments <file
qui font la même chose mais sont moins chers en termes de ressources.
Depuis 1995, des récompenses sont remises occasionnellement pour les meilleures utilisations inutiles de cat (UUOC). Il arrive souvent que Randal L. Schwartz (en), auteur de nombreux livres sur Perl et consultant en programmation, remette ces récompenses. Il y a d'ailleurs un site Web consacré uniquement à l'UUOC Award ainsi qu'à d'autres récompenses similaires.
Pour les hackers, l'activité de supprimer des UUOC est parfois appelé demoggification (« Moggy » étant un terme d'anglais du Commonwealth désignant affectueusement un chat domestique, « a cat »).