Il semble que les nouvelles versions de bash ont l' &>
opérateur, qui (si je comprends bien), redirige à la fois stdout et stderr vers un fichier ( &>>
ajoute plutôt au fichier, comme Adrian l'a clarifié).
Quel est le moyen le plus simple de réaliser la même chose, mais à la place de passer à une autre commande?
Par exemple, dans cette ligne:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Je voudrais que le grep corresponde au contenu à la fois dans stdout et stderr (effectivement, les combiner en un seul flux).
Remarque : cette question concerne la tuyauterie, pas la redirection - il ne s'agit donc pas d'un double de la question dont elle est actuellement marquée comme duplicata.
|&
raccourci, qui je pense est de loin la solution la plus pratique pour "rediriger à la fois stdout et stderr vers un tube".Réponses:
(Notez que les
&>>file
ajouts à un fichier tandis&>
que redirigeraient et écraseraient un fichier existant précédemment.)Pour combiner
stdout
etstderr
vous redirigeriez ce dernier vers le premier en utilisant2>&1
. Cela redirige stderr (descripteur de fichier 2) vers stdout (descripteur de fichier 1), par exemple:stdout
va à stdout,stderr
va à stderr.grep
voit seulementstdout
, doncstderr
imprime sur le terminal.D'autre part:
Après avoir écrit à la fois dans stdout et stderr,
2>&1
redirige stderr vers stdout etgrep
voit les deux chaînes sur stdin, filtrant ainsi les deux.Vous pouvez en savoir plus sur la redirection ici .
Concernant votre exemple (POSIX):
ou, en utilisant
>=bash-4
:la source
&>>
. J'ai corrigé ma question.|&
au lieu de2>&1 |
.|&
accompagnement sur le raccourci proposé par @ AdrianFrühwirth pour les futurs lecteurs: cette fonctionnalité n'est prise en charge qu'avec labash
version 4+. Si vous utilisez 3 ou moins, vous devez vous en tenir à2>&1 |
.Bash a un raccourci pour
2>&1 |
, à savoir|&
, quels tuyaux à la fois stdout et stderr (voir le manuel ):Cela a été introduit dans Bash 4.0, voir les notes de publication .
la source