Entrées - sorties

Conçus pour traiter des flux de données provenant de ou allant vers des fichiers tels que précédement définis, les executables sous Linux agissent comme des filtres, recevant (éventuellement) un flux de données en entrée et générant un flux de données en sortie, en fonction de son entrée.

Figure 2: Entrée - sorties
\includegraphics{stdio.eps}

Une commande Linux se présente souvent comme une succession de filtres. Par exemple pour transformer une image jpeg en tiff, on peut utiliser une commande telle que:
cat monfichier.jpg | djpeg | pnmtotiff > monfichier.tif

On peut rediriger un ou plusieurs des trois flux avec les symboles plus-grand-que ou plus-petit-que:

Entrée standard STDIN < Le symbole ``<'' suivi d'une entrée de répertoire valide y fera pointer l'entrée standard.
Sortie standard STDOUT > Le symbole ``>'' suivi d'une entrée de répertoire valide y fera pointer la sortie standard. Si l'entrée n'existe pas mais que le répertoire est accessible en écriture, le fichier sera alors créé.
Sortie d'erreur STDERR 2> Sortie d'erreur (Le symbole ``2>'' aurra le même effet sur la sortie d'erreur que ``>'' sur la sortie standard.

Des commandes comme dd, cat ou encore grep, sed, etc. fonctionnent comme des filtres à part entière.

Bien que les trois flux existent, certaines commandes ne les utilisent pas tous, comme par exemple ls, cp ou uptime n'utilisent pas d'entrée et d'autres comme rm, lpr ou umount n'utilisent en prinicipe pas de sortie standard. Toutes, cependant utiliseront la sortie d'erreur pour signaler un disfonctionnement.

La sortie d'erreur sert à communiquer des états déstinés à la surveillance du déroulement d'une commande. Bien que par défaut, la sortie d'erreur pointe sur le même périphérique que la sortie standard, elle constitue un flux de données distinct afin de ne pas perturber les données que l'on cherche à obtenir.

A noter que de se débarrasser des messages d'erreurs connus en tapant
... 2>/dev/null est source d'ennuis. On préfèrera une syntaxe du style:
( ... ) 2>&1 | grep -v 'message connu\|autre message' >&2

Attention la ligne étant lue séquentiellement de gauche à droite, l'ordre d'apparition des commandes de redirections est important.

Par exemple:
cat </dev/xconsole 2>&1 >/dev/lp0 | logger
La commande cat sera lancée mais avant, son entrée standard sera pointée sur le pipe nommé ``/dev/xconsole'', sa sortie d'erreur sera renvoyée sur sa sortie standard, c'est à dire le pipe ``|'' qui figure à la fin de la commande cat et enfin sa sortie standard sera envoyée directement sur le périphérique /dev/lp0 (le port imprimante). La commande logger sera ensuite lancée en utilisant le pipe ``|'' créé par la commande précédente (la sortie d'erreur de la commande cat) comme entrée standard.

La commande:
cat </dev/xconsole >/dev/lp0 2>&1 | logger
n'aura pas le même effet: la sortie standard pointant sur /dev/lp0 au moment de la lecture de la commande de redirection 2>&1, la sortie d'erreur sera également redirigée sur /dev/lp0. La commande logger ne recevra donc rien.

Félix Hauri 2004-06-23