2013-11-22 162 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