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

如何显示使用bash set-e时失败的最后一个命令?,bash,Bash,我正在使用set-e在出现第一个错误时停止脚本的执行 问题是,这并没有告诉我哪里出了问题 如何更新bash脚本,使其显示上次失败的命令?您是否尝试过使用--verbose bash --verbose script.sh 您不能单独使用set-e,因为在发生任何错误后,处理将立即停止。查看Bash参考手册的第页,了解有关-x和-v选项的更多信息,您可以使用这些选项进行调试 比如: set -e set -v 将在任何错误时退出,同时在读取时显示每个输入行。但是,它不会仅显示带有错误的行。为此

我正在使用
set-e
在出现第一个错误时停止脚本的执行

问题是,这并没有告诉我哪里出了问题


如何更新bash脚本,使其显示上次失败的命令?

您是否尝试过使用
--verbose

bash --verbose script.sh

您不能单独使用
set-e
,因为在发生任何错误后,处理将立即停止。查看Bash参考手册的第页,了解有关-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

使用错误陷阱,而不是
set-e
;您可以传入
$BASH\u LINENO
以获取发生错误的特定行号。我在下面的回答中提供了一个脚本,利用了这一点

总结如下:

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

set-ex
将在执行时显示(所有)行,并在第一个返回非零的命令时停止(不作为
if/while/until
构造的一部分)

  • 犯错误

    set -e
    trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR
    
  • 将它(
    .err.sh
    )包含在所有脚本中

  • 替换任何

    …|读X时;做完成


    读取X时
    ;做done<不要使用set-e,使用您自己的错误检查。我同意Jordan的观点。有关更多信息,请参阅。如果希望脚本在调用trap函数后退出,您还可以同时使用
    set-e
    和ERR trap,或者在需要时,可以在trap函数中显式调用
    exit
    ;echo$str
    ?在我们的Works bash库中非常有用!不用再挖了,看看什么命令失败了。很好!如果您希望在脚本中到处使用此机制,而不使用带有此
    error
    函数的共享库,我建议只添加这一行(而
    #!/bin/bash-e
    set-e
    处于启用状态):
    陷阱“echo”[error]错误发生在$bash\u源:$LINENO命令:$bash\u命令“'ERR
    。。这还将打印导致故障的命令。