我正在使用set -e
在第一次错误时停止执行脚本。
问题是这并不能告诉我出了什么问题。
如何更新bash脚本以便它显示最后一个失败的命令?
答案 0 :(得分:20)
而不是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
答案 1 :(得分:1)
您是否尝试过--verbose
?
bash --verbose script.sh
答案 2 :(得分:1)
制作err.sh
set -e
trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR
在所有脚本中包含它(. err.sh
)。
替换任何
... | while read X ; do ... ; done
与
while read X ; do ... ; done < <( ... )
在您的脚本中,陷阱在错误消息中提供正确的行号/命令
答案 3 :(得分:0)
您不能单独使用set -e
,因为处理会在出现任何错误后立即停止。有关-x和-v选项的更多信息,请查看Bash参考手册的Set Builtin section,您可以使用它们进行调试。
类似的东西:
set -e
set -v
将在任何错误时退出,同时在读取时显示每个输入行。但是,它不会向您显示错误行。为此,您需要进行自己的显式错误检查。
例如:
set +e
if false; then
real_exit_status=$?
echo 'Some useful error message.' >&2
exit $real_exit_status
fi
答案 4 :(得分:0)
set -ex
将在执行时显示(所有)行,并在第一个返回非零的命令处停止(不作为if/while/until
构造的一部分)。