(foo; echo $?) 为 return >0 w/ set -e 的函数回显空字符串

(foo; echo $?) echoing empty string for functions that return >0 w/ set -e

我正在尝试对一些 bash 脚本进行单元测试。我的函数之一 returns 1 作为假值,我可以在像

这样的测试中使用它
foo() {
  return 0
}

if foo; then
  echo "Passed"
fi

这对于编写干净的代码非常方便。

然而,当尝试使用 shunit2 对该代码进行单元测试时,assertFalse 断言需要一个字符串值来测试。

我通过编写这样的测试解决了这个问题:

test_foo() {
  local result="$(foo; echo $?)"
  assertFalse "$result"
}

但是当 foo returns 1 时失败。 echo $? 似乎在回显一个空字符串,而不是实际的 return 代码。

知道发生了什么事吗?

编辑

这似乎只有在设置 set -e 时才会发生。不知道为什么。

试试这个代码:

if [ foo == 0 ]
then
   echo "passed"
else
   echo "error"
fi

set -e,子shell

(foo; echo $?)

如果 foo 失败则退出——在这种情况下在 foo returns 之后立即退出——所以 echo $? 永远不会执行。

作为旁注,some people dislike set -e(这是有充分理由的,您将通过阅读 link 来发现)。

我知道你的测试函数应该是这样的:

test_foo() {
  local result="$(foo; echo $?)"
  assertFalse "[ $result == 0 ]"
}

断言用法:

assertFalse [message] condition

你可以找到用法Here