(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
我正在尝试对一些 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