我想在返回值为非零时显示一个特定命令的错误日志行。 我正在使用" 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