在以set -e开头的bash脚本中,我可以将退出代码设置为与第一个失败命令不同的值吗?

a.p*_*anz 2 linux bash init.d

我目前正在研究一些应该使用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)

gee*_*rt3 5

在手册页中,您可以设置陷阱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陷阱.