Bash 通过grep输送尾部时无输出

Bash 通过grep输送尾部时无输出,bash,Bash,有一个文件位于$filepath,它逐渐增长。我想打印以感叹号开头的每一行: while read -r line; do if [ -n "$(grep ^! <<< "$line")" ]; then echo "$line" fi done < <(tail -F -n +1 "$filepath") PS2。在GNUBASH,版本4.3.48(1)-release和tail(GNUCoreutils)8.25grep下的测

有一个文件位于
$filepath
,它逐渐增长。我想打印以感叹号开头的每一行:

while read -r line; do 
    if [ -n "$(grep ^! <<< "$line")" ]; then
        echo "$line"
    fi
done < <(tail -F -n +1 "$filepath")

PS2。在
GNUBASH,版本4.3.48(1)-release
tail(GNUCoreutils)8.25
grep
下的测试在其标准输出未连接到tty时未进行行缓冲。因此,它试图在生成一些输出之前处理一个块(通常是4kib或8kib左右)

您需要告诉
grep
按行缓冲其输出。如果您使用的是GNU grep,那么它可以:

done < <(tail -F -n +1 "$filepath" | grep '^!' --line-buffered)
                                               ^^^^^^^^^^^^^^^

done<@iBug-Wow。谢谢你的反馈。我仔细地重新尝试了上面的代码,它仍然有效。我使用的是Ubuntu 16.04上发布的4.3.48(1)版GNU Bash。对于第二个版本,您可以尝试
grep--line buffered
查看@Sundeep谢谢。你的评论明显早于iBug的帖子。难以置信。。。它实际上与
tail-F
没有任何关系,这让我困惑了好长一段时间才发现这是
grep
的错。@Sundeep,尽管你赢了我。你的评论结果是正确的答案。
echo ' something' >> "$filepath"
echo '!something' >> "$filepath"
done < <(tail -F -n +1 "$filepath" | grep '^!' --line-buffered)
                                               ^^^^^^^^^^^^^^^