Shell: rediriger stdout vers / dev / null et stderr vers stdout [dupliquer]

cette question a déjà une réponse ici:

j'ai vu cette question intéressante dans un commentaire sur cyberciti.biz .

que j'ai trouvé Je ne peux même pas trouver un moyen flexible pour faire cela en ligne de commande avec sh.

dans la mesure où ma pensée pour la solution est:

tmp_file=`mktemp`
(./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script
rm tmp_file

Mais voyez-vous, ce n'est pas synchrone, et fatalement, c'est tellement laid.

bienvenue pour partager votre esprit à ce sujet. :)

33
demandé sur Shou Ya 2012-08-19 18:14:59

3 réponses

Vous voulez

./script 2>&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 ATS initialement ,donc 151990920"

0: /dev/tty, 1: /dev/tty, 2: /dev/tty

La première chose qui monte est la pipe. autre-STDIN de script se connecte à la pipe, et stdout de script se connecte à la pipe, donc les descripteurs de fichier de script ressemblent jusqu'à présent à:

0: /dev/tty, 1: pipe, 2: /dev/tty

ensuite, les redirections se produisent, de gauche à droite. 2>&1 rend fd 2 aller partout où fd 1 va actuellement, qui est le tuyau.

0: /dev/tty, 1: pipe, 2: pipe

enfin, >/dev/null redirige fd1 vers /dev/null

0: /dev/tty, 1: /dev/null, 2: pipe

résultat final, le stdout de script est réduit au silence, et son stderr est envoyé à travers le tuyau, qui se termine dans le stdin de l'autre-script.

Voir aussi http://bash-hackers.org/wiki/doku.php/howto/redirection_tutorial

83
répondu geirha 2012-08-25 00:26:56

Que pensez-vous de ceci:

./script 3>&1 1>/dev/null 2>&3 | ./other-script

l'idée est de" sauvegarder " le descripteur stdout, fermer le stdout original et ensuite rediriger strerr vers le stdout sauvegardé.

est très similaire à la solution fournie par geirha, mais son plus explicite (Bash codage peut facilement devenir très obscurci).

5
répondu Zaar Hai 2012-08-19 14:38:03

C'est parce que tu ne peux pas. STDOUT et STDERR ne sont que deux fichiers, représentés par des descripteurs de fichiers, qui ne sont que des entiers, en particulier 1 et 2.

ce que vous demandez est de définir le descripteur 2 à /dev/null , puis de définir le descripteur 3 au même descripteur de fichier 2 et que cette sortie aille ailleurs.

-3
répondu Charlie Martin 2012-08-19 14:22:32