2014-10-04 36 views
0

時出現奇怪行爲我正在閱讀Linux文檔項目中的this bash指南。 第81頁和82有一個用於測試的短示例腳本選項是否設置:檢查shell選項是否設置爲[-o OPTION],當OPTION爲

if [ -o noclobber ] 
    then 
    echo "Your files are protected against accidental overwriting using redirection." 
fi 

試圖否定測試時,我遇到了一些奇怪的行爲。對於打開爲[ -o OPTION ][ ! -o OPTION ]的所有選項,我得到的返回值爲0。以下是一個示例:

$ set -o | grep errex 
errexit   off 
$ [ -o errexit ]; echo $? 
1 
$ [ ! -o errexit ]; echo $? 
0 
$ set -o | grep history 
history   on 
$ [ -o history ]; echo $? 
0 
$ [ ! -o history ]; echo $? 
0 
+0

我沒有看到那個-o做你期望的'man test | grep -A1「\ -o」'。 – 2014-10-04 21:52:26

回答

4

改爲使用[[ ! -o option ]]。解析[[ ]]中的表達式更具可預測性。

你與[看到的結果是因爲有兩個-o運營商在bash的test內置:一元-o option檢查的選項設置,和二進制test1 -o test2檢查,如果任一測試結果爲真(邏輯或)。

您正在通過test三個參數,!,-ohistory。讓我們來看看POSIX says about it如何解析三個參數:

3 arguments: 
    - If $2 is a binary primary, perform the binary test of $1 and $3. 
    - If $1 is '!', negate the two-argument test of $2 and $3. 
    (...) 

-o,的確是一個二元運算符,所以它執行的$1$3的測試,成爲「非空」檢查(如在[ ! ][ history ])。結果是正確的。

第二種解釋是你所期望的,但是自第一種解釋匹配以來就沒有使用它。

+0

+1。 '! [-o選項]'也是可能的,如果你有一個不理解'[['。 – rici 2014-10-05 05:49:51

+0

@rici'-o'對於選項本身是bash特有的,所以這不太可能。 – 2014-10-05 06:52:25

+0

好點。知道這一點仍然有用!不只是內部括號。 – rici 2014-10-05 06:57:47

相關問題