Outils pour utilisateurs

Outils du site


enseignement:lea:cours:informatique:linux:text-stream

Unix pour linguistes : commandes, filtres

Répertoires et fichiers

cat(1) est surtout le prototype du filtre. Un filtre est une commande comme une autre. À ce titre, elle a :

I/O Descripteur Où ? Matérialisé comment ?
une entrée standard 0 aka STDIN par défaut, entrée au clavier
une sortie standard 1 aka STDOUT par défaut, affichage sur le terminal
une sortie erreur 2 aka STDERR par défaut, affichage sur le terminal

Ces descripteurs sont redirigeables. Si on veut envoyer la sortie vers un fichier /tmp/output :

$ cat /tmp/input
plop
$ cat /tmp/input > /tmp/output
$ cat /tmp/output
plop

Ce qui fait de cat(1) un filtre c'est qu'on peut lui donner du contenu via une autre commande i. e. rediriger son entrée standard :

$ echo "plop"
plop
$ echo "plop" | cat
plop
$ echo "plop" | cat > /tmp/output
$ cat /tmp/output
plop

Ici on vérifie que la commande echo(1) affiche sur la sortie standard son argument. Ensuite, quand on enchaîne avec un pipe (tube), on voit que cat(1) affiche bien ce qu'on lui passe. Enfin, quand on demande à cat(1) d'enregistrer dans un fichier /tmp/output, on vérifie bien que le contenu est ce que l'on a envoyé.

Les tubes servent essentiellement à éviter la création de fichiers temporaires / intermédiaires.

Si on a un fichier /tmp/input, on peut avoir :

$ cat < /tmp/input > /tmp/output

et les deux fichiers /tmp/input et /tmp/output seront identiques.

Le plus souvent, STDOUT passe par une mémoire tampon tandis que ce n'est pas le cas pour STDERR. Cela peut s'exprimer par un affichage immédiat des erreurs mais un affichage différé des résultats. Dans tous les cas, sans redirection de l'une ou l'autre, les deux sorties seront mélangées sur le terminal.

Outre ces trois descripteurs d'entrée sortie, toute commande envoie une valeur de retour au shell. Si tout c'est bien passé, la valeur est 0 par convention, un nombre entier non nul sinon.

On peut interroger le shell sur la valeur de retour de la dernière commande :

$ echo plop > /tmp/foo
$ echo $?
0
$ echo plop > /bin/cat
bash: /bin/cat: cannot overwrite existing file
$ echo $?
1

Ici, 1 est un retour normal affiché sur STDOUT même s'il dénote une erreur. Par contre le message cannot overwrite existing file a été généré par echo(1) et affiché par le shell.

Il faut prendre l'habitude de lire systématiquement l'affichage dans le terminal. En cas d'erreur, c'est le premier endroit où chercher une indication.

Éditeur de texte

enseignement/lea/cours/informatique/linux/text-stream.txt · Dernière modification: 2010/05/30 12:51 par Pascal Cabaud