grep
produzirá as linhas que correspondem a um padrão, não podendo produzir nada até uma linha completa (ou fim de arquivo no qual, se a última linha não foi terminada , o comportamento varia dependendo da implementação) foi lido.
Então, em:
(echo -n foo; sleep 1; echo bar) | grep .
Não é porque echo
armazena em buffer sua saída . Não faz. Como poderia, uma vez terminado? É porque grep
está aguardando o fim da linha (que virá, imediatamente seguido pelo fim do arquivo com o segundo echo
).
Para fazer o que você parece querer, você precisa ler as linhas com um tempo limite para cada linha como (com 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
(você recebe um passe no loop pelo menos a cada 0,1 segundo).