La commande Unix / Linux de Kyle fait le travail de commutation du STDERR avec le STDOUT; cependant, l'explication n'est pas tout à fait correcte. Les opérateurs de redirection ne font pas de copie ou de duplication, ils redirigent simplement le flux dans une direction différente.
Réécrire la commande de Kyle en déplaçant temporairement le 3> & 1 à la fin, faciliterait la compréhension du concept:
find /var/log 1>&2 2>&3 3>&1
Écrit de cette façon cependant, Linux afficherait une erreur car & 3 n'existe pas encore car il se trouve avant 3> & 1. 3> quelque chose est un moyen de déclarer (définir) que nous allons utiliser un troisième tuyau, il faut donc le localiser avant de faire couler de l'eau dans ce tuyau, par exemple la façon dont Kyle l'a écrit. Essayez cette autre façon juste pour le plaisir:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Ne pas avoir de moyen de faire des copies est une honte. Vous ne pouvez pas faire des choses comme "3> & 1 3> & 2" dans la même commande, car Linux n'utilisera que le premier trouvé et rejettera le second.
Je n'ai pas (encore) trouvé de moyen d'envoyer à la fois l'erreur et la sortie normale dans un fichier et d'envoyer également une copie de l'erreur à la sortie standard avec une seule commande. Par exemple, j'ai un travail cron que je veux que les deux sorties (erreur et standard) soient enregistrées dans un fichier journal et que l'erreur disparaisse également pour envoyer un message électronique à mon blackBerry. Je peux le faire avec deux commandes en utilisant "tee" mais l'erreur ne s'affiche pas dans le bon ordre parmi la ligne de sortie régulière du fichier. C'est la façon laide dont j'ai résolu le problème:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Notez que je dois utiliser log1 deux fois et que je dois ajouter dans les deux cas, le premier en utilisant l'option "-a" pour la commande "tee" et le second en utilisant ">>".
En faisant un journal de chat1, vous obtenez ce qui suit:
STD1
STD2
-bash: sdfr: command not found
Notez que l'erreur ne s'affiche pas comme il se doit sur la deuxième ligne.