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