Que diriez-vous de ceci :
./script 3>&1 1>/dev/null 2>&3 | ./other-script
L'idée est de "sauvegarder" le descripteur de sortie standard, de fermer la sortie standard d'origine, puis de rediriger strerr vers la sortie standard enregistrée.
C'est très similaire à la solution fournie par geirha, mais c'est plus explicite (le codage bash peut facilement devenir très obscur).
Vous voulez
./script 2>&1 1>/dev/null | ./other-script
L'ordre ici est important. Supposons que stdin (fd 0), stdout (fd 1) et stderr (fd 2) soient tous connectés à un tty initialement, donc
0: /dev/tty, 1: /dev/tty, 2: /dev/tty
La première chose qui se met en place est le tuyau. Le stdin d'autre-script est connecté au tube, et la sortie standard du script est connectée au tube, donc les descripteurs de fichier du script ressemblent jusqu'à présent à :
0: /dev/tty, 1: pipe, 2: /dev/tty
Ensuite, les redirections se produisent, de gauche à droite. 2>&1
fait aller fd 2 là où va actuellement fd 1, c'est-à-dire le tuyau.
0: /dev/tty, 1: pipe, 2: pipe
Enfin, 1>/dev/null
redirige fd1 vers /dev/null
0: /dev/tty, 1: /dev/null, 2: pipe
Résultat final, la sortie standard du script est réduite au silence et son stderr est envoyé via le canal, qui se retrouve dans le stdin d'autre script.
Voir aussi http://bash-hackers.org/wiki/doku.php/howto/redirection_tutorial
Notez également que 1>/dev/null
est synonyme de, mais plus explicite que >/dev/null