Bash实时读取STDOUT流

时间:2013-11-22 01:05:52

标签: bash

我已经搜索过这个,并期望找到数百种解决方案,但却找不到!

我想读取STDOUT流并等待显示特定字符​​串,而不等待该过程完成。

我现在拥有的,在返回输出之前等待进程完成:

RESP=$(execute some command 2>&1)
if $RESP contains something then do something;

如何实时读取流而不是等待它完成?

修改

我尝试了paddy的以下建议,测试使用ping命令:

RESP=$(ping 192.168.0.1 | grep seq=5 -m1)

但是它不能用于我想要使用dhcpcd的命令:

RESP=$(dhcpcd wlan0 -r 192.168.0.190 | grep claims -m1)

与ping测试不同,命令的输出被发送到控制台而不是被隐藏,它从不检测"声明"文本,即使它出现在输出中?

2 个答案:

答案 0 :(得分:3)

您可以通过管道grep进行匹配,并在遇到匹配时退出。这也将退出产生输出的程序。

if mycommand | grep something -q; then
    dosomething
fi

如果匹配(-q),上述内容将退出,但不显示结果。如果要查看输出,可以退出第一个匹配项(使用-m1):

RESP=$(mycommand | grep something -m1)

阅读grep的手册页以获取更多信息。


如果您不想取消产生输出的程序,可以尝试在后台将其写入文件,然后tail该文件:

mycommand > output &
if tail -f output | grep something -q; then
    dosomething
fi

答案 1 :(得分:0)

this unix.stackexchange answer中,我得到了以下解决方案:

cmd_which_streams_new_lines \
| while read -r line; do
  # process your line here
  echo "${line}"

  # when you're done, break the loop (be prepared for messy stderr)
done