210 votes

Piping à la fois stdout et stderr dans bash ?

Il semble que les nouvelles versions de bash aient l'option &> qui (si je comprends bien), redirige à la fois stdout et stderr vers un fichier ( &>> ajoute au fichier à la place, comme Adrian l'a précisé).

Quel est le moyen le plus simple d'obtenir la même chose, mais en passant par une autre commande ?

Par exemple, dans cette ligne :

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError

J'aimerais que le grep corresponde au contenu à la fois de stdout et de stderr (en fait, qu'ils soient combinés en un seul flux).

Note Cette question porte sur la tuyauterie, no redirection - afin qu'elle ne soit pas un doublon de la question pour laquelle elle est actuellement marquée comme doublon.

208voto

Adrian Frühwirth Points 8883

(Notez que &>>file ajoute dans un fichier tandis que &> redirigerait et écraser un fichier existant précédemment).

Pour combiner stdout y stderr vous redirigez le dernier vers le premier en utilisant 2>&1 . Cela redirige stderr (descripteur de fichier 2) vers stdout (descripteur de fichier 1), par exemple :

$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$

stdout va vers stdout, stderr va sur stderr. grep seulement voir stdout et donc stderr imprime dans le terminal.

D'un autre côté :

$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$

Après avoir écrit à la fois sur stdout et stderr, 2>&1 redirige stderr vers stdout et grep voit les deux chaînes sur stdin, et les filtre donc toutes les deux.

Vous pouvez en savoir plus sur la redirection aquí .

En ce qui concerne votre exemple (POSIX) :

cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError

ou, en utilisant >=bash-4 :

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

152voto

Benjamin W. Points 19035

Bash a un raccourci pour 2>&1 | à savoir |& qui achemine à la fois stdout et stderr (voir l'onglet manuel ) :

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

Cette fonctionnalité a été introduite dans Bash 4.0, voir la section notes de mise à jour .

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