繁体   English   中英

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

[英]How to display last command that failed when using bash set -e?

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

问题在于这并不能告诉我出了什么问题。

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

代替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

您尝试过--verbose吗?

bash --verbose script.sh
  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 < <( ... )

    在脚本中为陷阱在错误消息中提供正确的行号/命令

您不能set -e使用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 -ex将在执行时显示(所有)行,并在返回非零的第一条命令处停止(不作为if/while/until构造的一部分)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM