2012-05-24 26 views
16

我正在使用set -e在第一個錯誤時停止執行腳本。如何顯示使用bash set -e時失敗的最後命令?

問題是,這並不能告訴我哪裏出了問題。

如何更新bash腳本,使其顯示最後一條失敗的命令?

+2

不要使用set -e,請使用你自己的錯誤檢查。 – jordanm

+2

我同意約旦。請參閱[BashFAQ/105](http://mywiki.wooledge.org/BashFAQ/105)以獲取更多信息。 –

回答

17

代替set -e,使用ERR陷阱;您可以通過$BASH_LINENO來獲取發生錯誤的特定行號。我在https://stackoverflow.com/a/185900/14122

提供腳本趁着這個在我的回答總結:

error() { 
    local sourcefile=$1 
    local lineno=$2 
    # ...logic for reporting an error at line $lineno 
    # of file $sourcefile goes here... 
} 
trap 'error "${BASH_SOURCE}" "${LINENO}"' ERR 
+2

如果您希望腳本在調用陷阱函數後退出,您也可以同時使用'set -e'和ERR陷阱,或者您可以在陷阱函數中明確調用'exit'。 –

+1

任何想法如何使它處理未綁定變量'set -u; echo $ str'? –

+0

在我們的作品bash圖書館中很棒!沒有更多的挖掘,看看什麼命令失敗。 –

1

您是否嘗試過--verbose

bash --verbose script.sh 
0

不能單獨使用set -e因爲處理將任何錯誤後立即停止。查看Bash參考手冊的Set Builtin section,以獲取有關-x和-v選項的更多信息,您可以使用它們進行調試。

喜歡的東西:

set -e 
set -v 

將退出對任何錯誤,並且會顯示每個輸入行,因爲它是閱讀。但是,它不會向您顯示錯誤信息。爲此,您需要自己做明確的錯誤檢查。

例如:

set +e 
if false; then 
    real_exit_status=$? 
    echo 'Some useful error message.' >&2 
    exit $real_exit_status 
fi 
0

set -ex將顯示(全部)行,因爲它們被執行,並在第一個命令停止返回非零(而不是一部分的if/while/until構建體)。

0
  1. 化妝err.sh

    set -e 
    trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR 
    
  2. 包括它所有的腳本(. err.sh)。

  3. 更換任何

    ... | while read X ; do ... ; done

    while read X ; do ... ; done < <(...)

    在腳本

    的陷阱錯誤消息給正確的行數/命令