2013-11-22 118 views
1

我已经搜索了这个,并预计会发现数百个解决方案,但没有找到!Bash实时阅读标准输出流

我想读取STDOUT流并等待一个特定的字符串出现,而无需等待该过程完成。

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

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

如何我可以读取的实时,而不是等待它完成流?

编辑

我尝试以下的稻田,其用于测试使用ping命令的工作建议:

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

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

但是它不会与我想使用的dhcpcd命令工作

与ping测试不同,命令的输出被发送到控制台而不是隐藏,并且即使它存在于ou中也不会检测到“声明”文本tput?

+1

确定的dhcpcd的输出去标准输出?它可能通过stderr来到你的控制台?在这种情况下,您应该将'2>&1' stderr-输出重定向到stdout-output。 – urzeit

回答

2

您可以输入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 
+0

嗯,实际上,忘记最后的建议 - 这太天真了:如果没有找到文本,它将无限期地等待。希望第一个或第二个解决方案是你正在寻找的。 – paddy

+0

是的第二个选项效果很好,非常感谢 – crankshaft

+0

嗯,我用ping测试过它,它工作正常,但我用dhcpcd命令测试过,但没有。我已添加到原始问题。 – crankshaft