如何显示使用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
。。这还将打印导致故障的命令。