从 shell 脚本中的函数捕获退出状态

Capture exit status from function in shell script

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

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 -eset +e,还是没有成功。我不能使用 return 语句。

实际输出:

$ sh test.sh 
$ echo $?
1
$

实际输出:

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

您需要在函数内部使用 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.

不需要[[[

#!/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; }