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

How can i show error message for a particular command , if bash script terminates due to set -e

我想在某个特定命令的 return 值为非零时显示错误日志行。 我正在使用'set -e'来终止任何命令return的非零值以及'trap'用于这个

  #!/bin/bash
    set -e

    log_report() {
        echo "Error on line "
    } 

    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.. 本身。 我想退出并显示错误日志,仅针对给出非零 return 代码的特定命令 对于给出非零 return 代码的其余命令,退出时没有错误日志

set -e 不会阻止您检查命令行的状态,否则您会这样做:

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

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

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

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

在这种情况下,您应该:

  • 等到需要trap再安装(不需要at/near脚本开始)

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

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

例如:

#!/bin/bash

set -e

log_report() {
    echo "Error on line "
} 

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 再次禁用.但是在这个例子中,似乎整个过程都需要错误退出行为。)