2015-07-03 22 views
11

我有一個錯誤陷阱如下之後而不捕獲:如何陷阱命令

trap failed ERR 
function failed { 
    local r=$? 
    set +o errtrace 
    set +o xtrace 
    echo "###############################################" 
    echo "ERROR: Failed to execute" 
    echo "###############################################" 
    # invokes cleanup 
    cleanup 
    exit $r 
} 

有我的代碼的一部分,我做期待一個錯誤:

command1 
command2 
command3 
set +e #deactivates error capture 
command4_which_expects_error 
set -e #re-activates error capture 
command5 

總的來說,我需要command4_which_expects_error的執行過程中忽略該陷阱

集+ E似乎並不禁用陷阱。任何其他的方式來「饒恕」然後「重新陷阱」?

回答

18

這裏是你可以在陷阱手動查找:

The KornShell uses an ERR trap that is triggered whenever set -e would cause an exit.

這意味着它不會被set -e觸發,但是在相同的條件下執行。將set -e添加到陷阱上的ERR將使您的腳本在執行陷阱後退出。

要刪除一個陷阱,使用:

trap - [signal] 
1

您可以使用此trap重置trap先前設置:

trap '' ERR 
+2

'幫助trap'說,使用' '''忽略,'-'重置爲默認行爲。 –

0

要忽略,你知道會失敗命令失敗,則可能造成行總是通過附加|| true成功。

例子:

#!/bin/bash 

set -e 

failed() { 
    echo "Trapped Failure" 
} 
trap failed ERR 

echo "Beginning experiment" 
false || true 
echo "Proceeding to Normal Exit" 

結果

Beginning experiment 
Proceeding to Normal Exit