bash stdout stderr piping

Piping tanto stdout como stderr en bash?



(2)

Parece que las versiones más nuevas de bash tienen el operador &> , que (si entiendo correctamente), redirige tanto stdout como stderr a un archivo ( &>> 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 canalización, no de la redirección, por lo que no es un duplicado de la pregunta que actualmente está marcada como duplicada.


(Tenga en cuenta que el &>>file agrega a un archivo mientras &> lo redirigiría y sobrescribiría un archivo previamente existente).

Para combinar stdout y stderr redirigirías el último al anterior 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 tanto en stdout como en stderr, 2>&1 redireccionan stderr de regreso a stdout y grep ve ambas cadenas en stdin, por lo tanto filtra ambos.

Puede leer más sobre la redirección here .

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


Bash tiene una abreviatura para 2>&1 | , es decir |& , que canaliza tanto stdout como stderr (consulte el manual ):

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

Esto se introdujo en Bash 4.0, consulte las notas de la versión .