如何显示使用bash set -e时失败的最后一个命令?

sor*_*rin 17 bash

set -e用来在第一次错误时停止执行脚本.

问题是,这并没有告诉我出了什么问题.

如何更新bash脚本以便它显示最后一个失败的命令?

Cha*_*ffy 20

而不是set -e使用ERR陷阱; 您可以传入$BASH_LINENO以获取发生错误的特定行号.我在/sf/answers/13013031/的答案中提供了一个利用此功能的脚本

总结一下:

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
Run Code Online (Sandbox Code Playgroud)

  • 非常好!如果您想在脚本中使用此机制而不使用带有此`error`函数的共享库,我建议只添加此行(同时`#!/ bin/bash -e`或`set -e`打开):`trap'echo"[ERROR] $ BASH_SOURCE:$ LINENO命令发生错误:$ BASH_COMMAND"'ERR` ..这也会打印导致失败的命令. (3认同)
  • 如果希望脚本在调用陷阱函数后退出,也可以同时使用`set -e`和ERR陷阱,或者在需要时可以在陷阱函数中显式调用`exit`. (2认同)

use*_*275 5

  1. 制作错误.sh

    set -e
    trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将它 ( . err.sh) 包含在您的所有脚本中。

  3. 替换任何

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

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

    在脚本中让陷阱在错误消息中给出正确的行号/命令