next up previous contents Next: Utilisation de sed pour Up: Flux et sed comme Previous: Exemple d'un tube complexe.   Table des matières  

9.5 Redirections avec >&.

A présent, testez la commande ls nofile.txt > A. Nous nous attendons à ce que ls retourne un message d'erreur si nofile.txt n'existe pas. Le message d'erreur est en effet affiché mais il n'est pas écrit dans le fichier A. La raison en est que ls a écrit son message dans stderr tandis que > a seulement redirigé stdout. Pour faire en sorte qu'à la fois la sortie vers stdout et celle vers stderr soient versées dans le même fichier, il faut utiliser un opérateur de redirection. Pour le shell, sdtout est désigné par 1 et stderr par 2, de sorte qu'une commande doit être suivie de la redirection 2>&1 pour forcer stderr à accompagner la sortie de stdout. Les mots stderr et stdout sont, en fait, utilisés dans le langage C où les nombres 1 et 2 sont connus comme des numéros de fichiers ou des descripteurs de fichiers. Essayez ceci:

touch fichier_existant 
rm -f fichier_non_existant 
ls fichier_existant fichier_non_existant 


ls produira deux lignes: l'une contenant le terme fichier_existant et l'autre, un message d'erreur pour indiquer que le fichier fichier_non_existant n'existe pas. Le message d'erreur a été passé à stderr (ou descripteur de fichier 2) et la ligne d'après a été passée à stdout (descripteur de fichier 1).

A présent, exécutez les commandes suivantes:

ls fichier_existant fichier_non_existant 2>A 
cat A 


D'une part, la ligne associée à fichier_existant est retournée à l'écran et d'autre part, A contient le message d'erreur. Essayons la commande suivante:

ls fichier_existant fichier_non_existant 1>A 
cat A 


La notation 1> est la même que >A car, lorsque le descripteur de fichier n'est pas indiqué, le shell suppose qu'il s'agit d'1. Notez qu'A contient stdout et que le message d'erreur est retourné à l'écran.

Testons:

ls fichier_existant fichier_non_existant 1>A 2>&1 
cat A 


A présent, le fichier A contient le message d'erreur et la sortie normale. >& est appelé un opérateur de redirection. L'expression x>&y indique au shell d'écrire le tube x dans le tube y. La redirection est indiquée de la droite vers la gauche sur la ligne de commande. Donc, dans l'exemple ci-dessus, 2>&1 est opéré avant 1>A. Donc, stderr est mélangé à stdout et le résultat est redirigé vers A.

Finalement:

ls fichier_existant fichier_non_existant 2>A 1>&2 
cat A 


Nous observons que ceci a le même effet que précédemment, excepté que la séquence est inverse: stdout est d'abord redirigé vers stderr (1>&2) puis stdout est redirigé vers A.

Pour apprécier ce qui se passe en permutant les redirections entre elles, faisons:

ls fichier_existant fichier_non_existant 2>&1 1>A 
cat A 


ce qui signifie que stdout est redirigé vers A puis, que stder est redirigé vers stdout. Cette commande ne mixe pas stderr et stdout puisque la redirection vers A se produit en premier lieu.


next up previous contents Next: Utilisation de sed pour Up: Flux et sed comme Previous: Exemple d'un tube complexe.   Table des matières  
1-01-2006