2016-05-12 40 views
0

我有以下腳本來檢測重新啓動我的路由器後,當我的網絡回來的:當命令作爲變量傳遞時如何在命令替換時包含stdout/stderr重定向?

#!/bin/bash 
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null" 

while [[ ! $($pingCommand) ]]; do 
    sleep 3s; 
done 

然而,在終端中運行時,它打印:

平:未知的主機&>的/ dev/null的

我跑與-x選項的腳本(啓用調試),並發現

ping 192.168.1.1 -c 3 &>/dev/null 

正在在子shell執行作爲

ping 192.168.1.1 -c 3 '&>/dev/null' 

如何更改我的命令替換呼,這樣的bash不把周圍的輸出重定向單引號?

+2

http://mywiki.wooledge.org/BashFAQ/050 – 123

回答

7

Don't store commands in variables. Use functions.他們處理的重定向和管道沒有困擾變量的引用問題。

當您將所有輸出重定向到/dev/null時,嘗試捕獲ping的輸出也沒有任何意義。如果您只想知道它是否有效,請檢查其退出代碼。

pingCommand() { 
    ping 192.168.1.1 -c 3 &>/dev/null 
} 

while ! pingCommand; do 
    sleep 3s; 
done 
+0

我檢查它是退出代碼,但問題是如果有任何錯誤,它們將顯示在終端上,我不想要。 – crimsonspectre

+0

他們不會,因爲你有隱藏stdout和stderr的'&>/dev/null'。 –

+0

最初,我沒有'&>/dev/null',所以它顯示錯誤。當我在上面的腳本中添加'>/dev/null'時,那是當它打破時,因此問題haha – crimsonspectre

0

使用eval

#!/bin/bash 
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null" 

# set -x # uncomment to see what's going on 

while ! eval $pingCommand ; do 
    sleep 3s; 
done 

而且你不需要[[ ]](表達式求值)或$()(輸出捕捉)。

當然,正如John Kugelman在另一個答案中所建議的那樣,使用這些函數可以避免與eval相關的所有潛在缺陷。

+1

甚至sh -c $ pingCommand – fche

+1

@fche,'bash -c ...'你的意思。 POSIX shell不能'>重定向。 – Dummy00001