如果 bash 脚本由于设置 -e 而终止,我如何显示特定命令的错误消息



我想在返回值为非零时显示一个特定命令的错误日志行。 我正在使用" set -e"终止,如果任何命令返回非零值以及" trap">

#!/bin/bash
set -e
log_report() {
echo "Error on line $1"
} 
trap 'log_report $LINENO' ERR
echo "starting ..."
first_badcommand
echo "running"
second_badcommd

输出:

starting ...
/tmp/test1.sh: line 10: first_badcommand: command not found
Error on line 10

由于我使用 set -e 脚本退出并显示我的错误日志first_badcommand.. 本身。 我想退出错误日志,只针对给出非零返回代码的特定命令 对于给出非零返回代码的其余命令,退出而不带错误日志

澄清后,似乎要求是在发生任何错误时退出脚本,但是在问题中描述为"badcommand"的命令可能会失败,也可能不会失败。

在这个答案中,我将命令简单地命名为first_command等,以反映它们可能会或可能不会失败的事实。

正如问题中所建议的,如果发生错误,set -e命令确实会终止脚本,并且trap ... ERR安装一个处理程序,该处理程序将在错误后运行(并且在脚本退出使用set -e的位置之前(。

在这种情况下,您应该:

  • 等到需要陷阱后再安装(不需要在脚本开始时/附近完成(

  • 当不再需要陷阱时,使用trap - ERR再次禁用陷阱

以便启用和禁用陷阱的命令围绕需要陷阱的命令。

例如:

#!/bin/bash
set -e
log_report() {
echo "Error on line $1"
} 
echo "starting ..."
first_command
trap 'log_report $LINENO' ERR
echo "running"
second_command
trap - ERR
echo "still running"
third_command

如果任何命令失败(由于顶部的set -e(,这将退出,但陷阱仅在second_command失败时运行。

(另请注意,同样不需要在脚本开始时应用set -e。 可以随时启用它,并使用set +e再次禁用它。 但在此示例中,似乎始终需要错误时退出行为。

set -e

不会阻止您检查命令行的状态:

if some_command
then
echo "It succeeded"
else
echo "It failed. Some message here."
exit 1
fi

最新更新