grep
выводит строки , которые соответствуют шаблону, поэтому он не может ничего вывести до полной строки (или конца -файла -, после чего, если последняя строка была не завершается, поведение зависит от реализации ).
Так в:
(echo -n foo; sleep 1; echo bar) | grep.
Это не потому, чтоecho
буферизует свой вывод . Это не так. Как это могло случиться, когда оно прекратилось? Это потому, что grep
ждет конца очереди (, которая придет,сразу же следует конец -файла -со вторымecho
).
Чтобы сделать то, что вы, кажется, хотите, вам нужно прочитать строки с тайм-аутом для каждой строки, например (с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
(вы получаете проход в цикле по крайней мере каждые 0,1 секунды ).