我已经搜索过这个,并期望找到数百种解决方案,但却找不到!
我想读取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测试不同,命令的输出被发送到控制台而不是被隐藏,它从不检测"声明"文本,即使它出现在输出中?
答案 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