web-dev-qa-db-fra.com

Tuyauterie à la fois stdout et stderr dans bash?

Il semble que les versions les plus récentes de bash aient l'opérateur &> qui, si je comprends bien, redirige stdout et stderr vers un fichier (&>> s'ajoute plutôt au fichier, comme Adrian l'a précisé).

Quel est le moyen le plus simple de réaliser la même chose, mais de passer à 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 dans stdout et stderr (en fait, les combiner en un seul flux).

Note: cette question concerne la tuyauterie, pas la redirection - elle ne représente donc pas une copie de la question mais est actuellement marquée comme une copie.

131
Andrew Ferrier

(Notez que &>>file ajoute à un fichier pendant que &> redirige et écrase un fichier existant précédemment.)

Pour combiner stdout et stderr, vous devriez rediriger ce dernier vers le premier en utilisant 2>&1. Ceci 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 à la sortie standard, stderr va à stderr. grep ne voit que stdout, donc stderr s'imprime sur le terminal.

D'autre part:

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

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

Vous pouvez en savoir plus sur la redirection ici .

Concernant 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
141

Bash a un raccourci pour 2>&1 |, à savoir |&, qui dirige à la fois stdout et stderr (voir le manuel ):

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

Cela a été introduit dans Bash 4.0, voir le notes de version .

92
Benjamin W.