¿Cómo deshabilitar correctamente una tubería?

Intento seguir varias respuestas en esto , esto y este hilo, pero mi canalización todavía aparece almacenado. Aquí hay un bash de ejemplo:

unbuffer sh -c 'echo -n test; sleep 1; echo; sleep 1; echo -n hello; sleep 1; echo' | grep . 

El command anterior debe imprimir inmediatamente la test , luego después de la segunda printing hello y después de un segundo segundo más. En cambio, obtengo un retraso de un segundo, solo luego test , luego, después de un retraso de dos segundos, hello con la salida del command.

Tenga en count que aquí estoy tratando de deshacerse por completo del almacenamiento en búfer, y la opción --line-buffenetworking de grep no ayudará. Entonces, ¿cómo realmente desconecto esta tubería?

Related of "¿Cómo deshabilitar correctamente una tubería?"

grep generará las líneas que coinciden con un patrón, por lo que no puede generar resultados hasta que se haya leído una línea completa (o el final del file, si la última línea no se terminó, el comportamiento varía según la implementación) .

Entonces en:

 (echo -n foo; sleep 1; echo bar) | grep . 

No es porque el echo amortigua su salida . No es así ¿Cómo podría, una vez que ha terminado? Es porque grep está esperando el final de la línea (que vendrá, seguido inmediatamente por el final del file con el segundo echo ).

Para hacer lo que parezca querer, necesitaría leer líneas con un time de espera para cada línea como (con bash ):

 (echo -n foo; sleep 1; echo bar) | while true; do TMOUT=0.1 IFS= read -r line; ret=$? if [ "$(kill -l "$ret")" = ALRM ]; then [ -n "$line" ] || continue ors= elif [ "$ret" -eq 0 ]; then ors=$'\n' elif [ -z "$line" ]; then break fi [[ $line =~ . ]] && printf %s "$line$ors" done 

(obtienes un pase en el circuito al less cada 0.1 segundos).