Parece que las versiones más nuevas de bash tienen el &>
operador, que (si lo entiendo correctamente), redirige tanto stdout como stderr a un archivo (se &>>
agrega al archivo, como Adrian aclaró).
¿Cuál es la forma más sencilla de lograr lo mismo, pero en lugar de utilizar otro comando?
Por ejemplo, en esta línea:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Me gustaría que grep coincida con el contenido tanto en stdout como en stderr (efectivamente, combínelos en una sola secuencia).
Nota : esta pregunta es sobre tuberías, no sobre redireccionamientos, por lo que no es un duplicado de la pregunta que actualmente está marcada como duplicado.
|&
acceso directo, que creo que es, con mucho, la solución más conveniente para "redirigir stdout y stderr a una tubería".Respuestas:
(Tenga en cuenta que se
&>>file
agrega a un archivo mientras&>
redirige y sobrescribe un archivo previamente existente).Para combinar
stdout
ystderr
redirigiría el último al primero usando2>&1
. Esto redirige stderr (descriptor de archivo 2) a stdout (descriptor de archivo 1), por ejemplo:stdout
va a stdout,stderr
va a stderr.grep
solo vestdout
, por lo tantostderr
imprime en la terminal.Por otra parte:
Después de escribir en stdout y stderr,
2>&1
redirige stderr de nuevo a stdout ygrep
ve ambas cadenas en stdin, por lo tanto, filtra ambas.Puede leer más sobre la redirección aquí .
Con respecto a su ejemplo (POSIX):
o, usando
>=bash-4
:fuente
&>>
. He corregido mi pregunta.|&
lugar de2>&1 |
.|&
margen sobre el acceso directo propuesto por @ AdrianFrühwirth para futuros lectores: esta función solo es compatible con labash
versión 4+. Si está utilizando 3 o menos, debe seguir2>&1 |
.Bash tiene una abreviatura para
2>&1 |
, a saber|&
, qué tuberías son stdout y stderr (consulte el manual ):Esto se introdujo en Bash 4.0, consulte las notas de la versión .
fuente