Tengo problemas con el filtrado grep de la salida make. En particular,
make target 2>&1 | grep -E --color=never "^make.*"
funciona como se esperaba, pero lo siguiente no imprimirá ningún resultado en la consola:
make target 2>&1 | grep -E --color=never "^make.*" | cat
¿Me estoy perdiendo algo obvio? ¿Por qué sale el primer comando pero no el segundo? ¿Tiene que ver con algún tipo de almacenamiento en búfer de IO? ¿O simplemente estoy siendo estúpido?
[EDITAR]: cat
es solo un marcador de posición de caso de prueba mínimo para el comando real que quiero usar.
[EDITAR]:Esto no parece ser un problema con grep, ya que reemplazarlo conackconduce al mismo comportamiento.
[EDITAR]:Escribe que gato es un marcador de posición para:
#!/bin/bash
cat - \
| grep -E --color=never "^.*warning:.*|^.*error:.*|^make.*[Ee]rror.*|^make.*" \
| hilite.sh -r "^.*warning:.*" -f yellow -B \
| hilite.sh -r "^.*error:.*" -f red -B \
| hilite.sh -r "^make.*[Ee]rror.*" -f red -B \
| hilite.sh -r "^make.*" -f magenta
[EDITAR]:Creo que es un problema de almacenamiento en búfer/IO. ¡Dejo la compilación ejecutándose en w/e y veré si finalmente obtiene el resultado necesario!
Respuesta1
Probablemente grep
esté detectando que no está escribiendo en un TTY, por lo que almacena más salida en el buffer, en lugar de operar en su modo habitual de buffer de línea (es decir, ve cada línea tal como se encuentra). Este comportamiento es más eficiente ya que genera menos write()
llamadas al sistema, pero si es un usuario que está esperando una salida canalizada, entonces puede ser un poco engañoso.
Si está utilizando GNU grep
(y, según su etiqueta de Linux, supongo que lo está), consulte la --line-buffered
opción, que le obligará grep
a trabajar en el modo de búfer de línea más familiar. Técnicamente, esto podría disminuir el rendimiento grep
(como se indica en la página de manual), pero dado que está viendo el resultado de una compilación en vivo, dudo que haga alguna diferencia en ese sentido.
Respuesta2
¿No estás seguro de lo que se supone que debe hacer tu comando? ¿Cat algún archivo que tenga make.* en su nombre de archivo?
Intenta cambiar el cat
por xargs cat
?
Respuesta3
Podrías intentar experimentar con unbuffer
, por ejemplo,
make target 2>&1 | unbuffer -p grep -E --color=never "^make.*" | cat