如果 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
再次禁用.但是在这个例子中,似乎整个过程都需要错误退出行为。)
我想在某个特定命令的 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
再次禁用.但是在这个例子中,似乎整个过程都需要错误退出行为。)