Pregunta Piping tanto stdout como stderr en bash?


Parece que las versiones más nuevas de bash tienen &> operador, que (si entiendo correctamente), redirige tanto stdout como stderr a un archivo (&>> se agrega al archivo, como aclaró Adrian).

¿Cuál es la forma más simple de lograr lo mismo, pero en cambio conectar con otro comando?

Por ejemplo, en esta línea:

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

Me gustaría que el grep coincida con el contenido tanto en stdout como en stderr (de hecho, combínelos en una secuencia).

Nota: esta pregunta es acerca de la tubería, no redirigir - por lo que no es un duplicado de la pregunta que está marcada actualmente como un duplicado de.


104
2018-05-11 12:55


origen


Respuestas:


(Tenga en cuenta que &>>file  Anexa a un archivo mientras &> redirigiría y exagerar un archivo previamente existente.)

Combinar stdout y stderr redirigirías a este último al primero usando 2>&1. Esto redirige stderr (descriptor de archivo 2) a stdout (descriptor de archivo 1), por ejemplo:

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

stdout va a stdout, stderr va a stderr. grep solo ve stdout, por lo tanto stderr imprime en la terminal.

Por otra parte:

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

Después de escribir en stdout y stderr, 2>&1 redirecciona stderr a stdout y grep ve ambas cadenas en stdin, por lo tanto filtra ambos.

Puedes leer más sobre la redirección aquí.

En cuanto a tu ejemplo (POSIX):

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

o, usando >=bash-4:

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

119
2018-05-11 13:11



Bash tiene una forma abreviada de 2>&1 |, a saber |&, que canaliza stdout y stderr (ver el manual)

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

Esto fue introducido en Bash 4.0, vea el Notas de lanzamiento.


56
2018-05-07 06:17