2012-09-29 49 views
2

我正在嘗試編寫腳本在自己的x會話中啓動xfce和xbmc。爲什麼重定向輸出會影響bash中的測試結果?

爲此,我設置DISPLAY值,在後臺運行第一個並等待從xset q獲得成功返回。然後我改變DISPLAY併爲另一個做同樣的事情。

我正在一塊一塊地寫這篇文章,以檢查每篇文章的語法都是正確的,而我被卡住的部分是'等到我從xset q獲得成功返回。

export DISPLAY=":0.0" 
while [[ ! `xset q` ]] 
do 
    echo -n "." 
done 

此代碼似乎工作,所以當XFCE運行時它立即退出,當它是不是坐在那裏打印.xset: unable to open display ":0.0"

不過,我不希望看到的xset輸出,所以我試圖重定向它的輸出。

export DISPLAY=":0.0" 
while [[ ! `xset q > /dev/null 2>&1` ]] 
do 
    echo -n "." 
done 

然而,添加這個重定向似乎破壞了檢測,無論XFCE是否在運行,它只是在那裏打印點。

我已經在他們自己的shell腳本中測試了這兩個命令,它們都按我期望的那樣工作,當XFCE未運行時返回1,當它運行時返回0。

任何人都可以解釋爲什麼把[[ ! `…` ]]內的命令打破while測試,我怎麼可以正確地重寫這個while循環?

(拱上運行)

+0

bash的重定向'&> file'等同於'>文件2>&1' –

+0

@glenn bash的重定向'&>'也可以說不是POSIX並且'cmd&> file'應該異步運行'cmd',然後截斷'file'(例如,它相當於'cmd&:>文件;')。一些shell會這樣對待它,並且最好避免它。 –

回答

3

的問題是,你不能在所有測試的xset返回代碼,你處理它的輸出。當您將輸出重定向到/dev/null,在反引號表達不返回任何東西,這是因爲如果你有:

while [[ ! '' ]] ... 

將始終運行while體。

你應該做的是:

while ! xset q > /dev/null 2>&1 
do 
    ... 
done 
+0

啊。我確實嘗試瞭解所有可用的不同括號語法,但看起來像括號仍然擊敗我! ;) 非常感謝。 –

+0

@ Styne666括號不是語法。 '['是一個命令,'[['是一個關鍵字,但它的功能就像一個命令一樣。 – jordanm

相關問題