我目前正在研究一些应该使用set -e和确认Linux Standard Base核心规范的init脚本.现在这两个人并没有真正合作:
由于set -e第一个失败的命令导致脚本以失败命令的返回值退出,因此我无法将脚本的退出状态设置为符合LSB符合LSB不兼容返回值失败的命令.我可以unset -e在每个这样的命令之前,但那是非常麻烦的,在那种情况下,我实际上根本不使用它set -e?
我想另一种方式来达到同样的效果与unset -e将做类似
returns_1() { return 1; }
...
cmd_that_fails_with_non_LSB_return_values || returns_1
Run Code Online (Sandbox Code Playgroud)
但这似乎也很笨重,我再次必须检查每个命令的可能返回值.
是否有一种方法可以设置脚本在终止时由于set -e固定值而返回的错误代码,因此它将返回1(即LSB一般/未指定的错误),而不是失败命令的返回值是什么?我不应该打扰LSB符合返回码和/或设置-e吗?(这可能会变成一个讨论,set -e无论如何从你获得的搜索结果的数量来判断)
小代码片段来说明问题:
#!/bin/bash
# init script for service foo
set -e
start() {
echo "bar"
cmd_fails_with_return_code_3 # script exits with return code 3, not LSB conformant
echo "baz"
}
...
case "$1" in
start)
start
;;
...
esac
Run Code Online (Sandbox Code Playgroud)
在手册页中,您可以设置陷阱ERR:
A trap on ERR, if set, is executed before the shell exits.
Run Code Online (Sandbox Code Playgroud)
我没试过这个,但这意味着这样的事可能对你有所帮助:
trap "exit 1" ERR
Run Code Online (Sandbox Code Playgroud)
请务必阅读手册页以获取其他有用的选项,例如-E继承子shell中的ERR陷阱.