Bash 尾部命令和多个管道

Adr*_*uau 5 bash pipe

我目前正面临命令问题

while sleep 0.3; do echo "1"; done | tail -n +3 | grep --line-buffered "1"
Run Code Online (Sandbox Code Playgroud)

我想要一个看起来像这样的输出:

[nothing during 0.6s]
1
1
...
Run Code Online (Sandbox Code Playgroud)

但有:

[nothing forever]
Run Code Online (Sandbox Code Playgroud)

我发现了这个问题并阅读了这篇博客文章,但由于该--line-buffered选项设置为grep,我认为这不是缓冲问题。我的研究并没有让我找到其他解决方案,我希望我没有遗漏一些明显的东西。

zsh 5.7.1 (x86_64-pc-linux-gnu)如果重要,我正在使用。

Jef*_*ica 5

正如 Barmar 在评论中提到的,这在4KB stdio buffer 中被吞没了。您可以使用unbuffer -p它来避免它:

while sleep 0.3; do echo "1"; done | unbuffer -p tail -n +3 | grep 1
Run Code Online (Sandbox Code Playgroud)

或者您也可以stdbuf在行缓冲模式下使用:

while sleep 0.3; do echo "1"; done | stdbuf -oL tail -n +3 | grep 1
Run Code Online (Sandbox Code Playgroud)