5 votes

Utilisez la substitution de processus - envoyez uniquement stderr vers un fichier

Pour une raison quelconque, il semble que stderr soit envoyé vers stdout dans le script bash suivant :

exec > >( while read line; do echo " stdout: $line"; done )
exec 2> >( while read line; do echo " stderr: $line"; done )

echo "rolo"
echo "cholo" >&2

Si vous le lancez, la sortie est la suivante :

stdout: rolo
stdout: stderr: cholo

Est-ce que quelqu'un sait pourquoi cela se produit ? Autant que je puisse dire, ce qui se passe est que stderr est envoyé vers stdout, c'est pourquoi la première ligne capture la sortie de la seconde ligne ?

5voto

Jonathan Leffler Points 299946

Oui - votre erreur standard est envoyée en sortie standard. C'est ce que vous avez demandé qu'il se produise.

Votre script exec 2> >(…) renvoie vers stdout, donc le script exec > >(…) le voit aussi - c'est pourquoi vous avez à la fois les balises stdout et stderr sur la ligne de sortie cholo.

Revisitez votre script (bash17.sh) comme suit :

exec  > >( while read line; do echo " stdout: $line"; done     )
exec 2> >( while read line; do echo " stderr: $line"; done >&2 )

echo "rolo"
echo "cholo" >&2

pour que l'erreur standard aille vers la sortie d'erreur, et vous voyez :

$ bash bash17.sh
 stdout: rolo
 stderr: cholo
$ bash bash17.sh > /dev/null
 stderr: cholo
$ bash bash17.sh 2> /dev/null
 stdout: rolo
$

Clair, pour envoyer l'erreur standard vers un fichier, vous utiliseriez une redirection alternative à l'intérieur du composant exec 2> >(…) du script.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X