如何在出现任何错误时自动从源bash脚本返回?

时间:2018-07-07 16:02:27

标签: bash return

我有一个bash脚本,该脚本仅应在被获取时使用。 我想在发生任何错误时自动从中返回,类似于set -e所做的。 但是,设置set -e对我不起作用,因为它也会退出用户外壳。

现在,我正在为每个命令像command || return 1一样手动返回。

3 个答案:

答案 0 :(得分:0)

您也可以使用command || truecommand || return。 如果您的要求有所不同,请更精确地更新。

答案 1 :(得分:0)

您可以使用trap。例如:

// foo.sh
function func() {
    trap 'if [ $? -ne 0 ]; then  echo "Trapped!"; return ; fi' DEBUG
    echo 'foo'
    find -name "foo" . 2> /dev/null
    echo 'bar'
}

func

两个音符。首先,trap必须位于所示函数内。如果只是在脚本中,它将无法正常工作。

两个,有一个明显的限制。即使将返回值设置为陷阱(例如return 1),尽管func在错误的find命令之后仍然存在,但$?仍然为零。我不确定是否可以解决此问题,因此,如果保留失败命令的退出值很重要,这可能行不通。

例如,如果您有:

func
func_return=$?
echo "return value is: $func_return"

func_return将始终为零。我一直在尝试获取失败命令的退出值以传递出函数陷阱并进入函数退出值,但是还没有找到解决方法。

如果需要保留返回值,则可以在调试陷阱中更新全局变量。

答案 2 :(得分:0)

如果我很了解,您可以在每个函数中本地设置-e。

{
  "took" : 27,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.4261419,
    "hits" : [
      {
        "_index" : "office",
        "_type" : "doc",
        "_id" : "o004",
        "_score" : 1.4261419,
        "_source" : {
          "name" : "Bob",
          "title" : "Awesome Title",
          "description" : "Finance Operations"
        }
      }
    ]
  }
}