这对你有用吗?
tail -n +0 -F /tmp/foo | sed '/EOF/q'
我假设“EOF”是您正在寻找的模式。该sed
命令在找到它时退出,这意味着它tail
应该在下次写入时退出。
tail
我想如果在文件的末尾找到模式,就会有一个外部机会存在,等待更多的输出出现在文件中,而这些输出永远不会出现。如果这真的是一个问题,您可能会安排将其杀死 - 整个管道将在终止时sed
终止(除非您使用的是一个有趣的外壳,它认为这不是正确的行为)。
对 Bash 不满
正如所担心的那样, (至少在 MacOS X 上,但可能无处不在)是一个认为即使退出bash
也需要等待完成的 shell 。有时——比我喜欢的更频繁——我更喜欢旧的 Bourne shell 的行为,它不那么聪明,因此比 Bash 猜错的次数更少。 是一个每秒发送一条消息的程序(示例中为“1:Hello”等),输出到标准输出。在 Bash 中,这个命令序列会一直挂起,直到我在单独的窗口中执行了 ' '。tail
sed
dribbler
echo pqr >>/tmp/foo
date
{ timeout -t 2m dribbler -t -m Hello; echo EOF; } >/tmp/foo &
echo Hi
sleep 1 # Ensure /tmp/foo is created
tail -n +0 -F /tmp/foo | sed '/EOF/q'
date
可悲的是,我没有立即看到控制这种行为的选项。我确实找到了shopt lithist
,但这与这个问题无关。
Korn Shell 万岁
我注意到,当我使用 Korn shell 运行该脚本时,它会按我的预期工作 - 留下一个tail
潜伏的东西以某种方式被杀死。echo pqr >> /tmp/foo
在第二个日期命令完成后,那里的工作是 ' '。