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.
(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
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 .