Shell: rediriger stdout vers / dev / null et stderr vers stdout [dupliquer]
cette question a déjà une réponse ici:
- comment pipe stderr, et non stdout? 10 réponses
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. :)
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
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).
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.