【问题标题】:Capture exit status from function in shell script从 shell 脚本中的函数捕获退出状态
【发布时间】:2015-07-30 09:11:14
【问题描述】:

我有一个非常简单的脚本。

test.sh

_EXECUTE_METHOD () {
  exit 1
}

_EXECUTE_METHOD
ERROR_CODE=$?
if [[ $ERROR_CODE -eq 1 ]]; then
  echo "Got error"
  exit 0
fi

exit 1 在函数内部执行时,该脚本立即终止。我想从函数中捕获这个退出状态并在主脚本中处理它。

我试过set -e & set +e,还是没有成功。我不能使用return 声明。

实际输出:

$ sh test.sh 
$ echo $?
1
$

实际输出:

$ sh test.sh
Got error 
$ echo $?
0
$

【问题讨论】:

  • "我不能使用return 声明。" - 是的你可以!试试看吧。
  • 分号后缺少then。此外,[[ 只不过是一个可移植性陷阱。应该使用[
  • @Jens 甚至可以完全放弃使用[Example

标签: shell exit


【解决方案1】:

你需要在函数内部使用return而不是exit

_EXECUTE_METHOD () { return 1; }

_EXECUTE_METHOD || echo "Got error"

exit 将终止您当前的 shell。如果您必须使用exit,则将此函数放入脚本或子shell中,如下所示:

declare -fx _EXECUTE_METHOD
_EXECUTE_METHOD () { exit 1; }

_EXECUTE_METHOD || echo "Got error"

(..) 将在子 shell 中执行函数,因此exit 只会终止子 shell。

【讨论】:

  • 子shell (..),退出代码捕获ERROR_CODE=$? 和Bash 测试[[ 似乎是redundant
  • 同意,但有时需要更详细的说明才能更好地理解。甚至if..then..else 也可以像现在更新的答案一样缩短。
【解决方案2】:

不需要[[[

#!/bin/sh

set -eu

_EXECUTE_METHOD () {
  return 1
}

if ! _EXECUTE_METHOD; then
  echo "Got error"
  exit 0
fi

或者如果你想简洁:

#!/bin/sh

set -eu

_EXECUTE_METHOD () {
  return 1
}

_EXECUTE_METHOD || { echo "Got error"; exit 0; }

【讨论】:

  • 永远不知道这在 shell 脚本中是可能的。今天学习新东西
猜你喜欢
  • 1970-01-01
  • 2017-03-08
  • 2013-09-09
  • 1970-01-01
  • 2013-03-01
  • 2014-11-01
  • 2017-05-18
  • 1970-01-01
  • 2013-08-28
相关资源
最近更新 更多