我尝试在 Bash 脚本中执行以下操作:运行命令(例如tail -f log_file
),等待特定输出到达,然后停止命令,并继续执行脚本。
我尝试了以下方法,但没有成功:
tail -f log_file | grep some_text | head -n1
Run Code Online (Sandbox Code Playgroud)
我这样没有输出。
现在,我尝试诊断问题。当我简单地运行tail -n1
,然后在终端中输入一些内容时,它会在第一行之后退出。但是,如果我运行以下命令:
grep some_text | head -n1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在按 CTRL+D 之前我不会得到任何输出,然后它会打印包含 的输入的第一行some_text
。
我的问题是,这是为什么?如果head
在第一种情况下立即输出第一行,为什么当它从管道获取输入时不输出呢?难道它不应该输出前n行的所有内容,然后退出,向管道的另一端发送 SIGPIPE 信号吗?
grep
缓冲您的输入。尝试grep --line-buffered
。
还有一个额外的问题,head
只有在收到第二行后才会终止,如果您的日志文件频率较低,这可能会出现问题。请参阅如何通过管道读取一行tail -f
,然后终止?。