答案1
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 秒在循环中获得一次通过)。