2016-01-21 19 views
2

如您所知,設置-e對於在執行命令時發現任何失敗非常有用。但是我發現它使用起來很細膩,我不知道如何在下列情況下使用它:如何在命令替換中使用檢測失敗

==============第一個示例====== ==========================

set -e 
function main() {  
    local X1="$(exp::notdefined)"  
    echo "Will reach here : ${LINENO}"  
    X2="$(exp::notdefined)"  
    echo "Will not reach here : ${LINENO}" 
} 
main 

==============第二個例子= ===============================

set -e  
function exp::tmp() {  
    echo "Now '$-' is "$-" : ${LINENO}"  
    false  
    return 0 
}  
function main() {  
    X1="$(exp::tmp)"  
    echo "Will reach here : ${LINENO}. '\$X1' : ${X1}"  
    X2="$(set -e ; exp::tmp)"  
    echo "Will not reach here : ${LINENO}" 
}  
main 

============ ===================

第一個例子表明,如果我們在本地va上使用命令替換riable,那麼即使找不到命令,它也不會失敗。我不知道如何檢測這類故障。

第二個例子顯示,如果bash選項(-e)不會傳播,除非我們在命令大括號中調用set -e。有沒有更好的方法來做到這一點?

+1

如果David是對的,你可以將'local'變量聲明和定義分成兩行,從第二個語句中獲取預期的錯誤代碼。 – jpaugh

回答

1

從bash的手冊:

Subshells spawned to execute command substitutions inherit the value of 
    the -e option from the parent shell. When not in posix mode, bash 
    clears the -e option in such subshells. 

實施例2的行爲不同的bash時與--posix運行;然而,例如1我找不到任何文件解釋爲什麼local會造成這種情況。

3

您對管道失效請求立即退出與-e,例如:

-e  Exit immediately if a pipeline (which may consistof a single simple 
     command), a list, or a compound command (see SHELL GRAMMAR above), 
     exits with a non-zero status. 

原因壞命令替換不會造成功能故障範圍內,因爲local提供了自己的返回狀態

本地[選項] [名稱[=值] ...]
...該返回狀態0除非本地被使用的功能外,一個 無效的名稱被提供,或名稱是隻讀變量。

失敗的命令替換的分配不原因local回非零。因此,不會立即退出。

至於檢查命令替換的以下local故障,由於輸出被分配給變量,並且返回不會非零在命令替換故障的情況下,就必須以驗證通過檢查變量內容本身以獲得成功/失敗的預期值。

+0

我確定我在幾個月前看到過一個類似的問題,引用了這個手冊,但現在我找不到它。 – Barmar

+0

這兩個都來自* local bash *,來自'local'和'set'內建部分。大約在第530頁和第690頁。 –

+0

我並不是說你的答案有任何問題,但我想將其標記爲早先問題的重複。 – Barmar