最佳答案
我有一个 shell 脚本,我想用 shUnit 测试它。这个脚本(和所有函数)都在一个文件中,因为它使安装更加容易。
例如 script.sh
#!/bin/sh
foo () { ... }
bar () { ... }
code
我想编写第二个文件(不需要分发和安装)来测试在 script.sh
中定义的函数
就像 run_tests.sh
#!/bin/sh
. script.sh
# Unit tests
现在问题在于 .
(或 Bash 中的 source
)。它不仅解析函数定义,还执行脚本中的代码。
因为没有参数的脚本没有什么不好的地方
. script.sh > /dev/null 2>&1
但我在想是否有更好的方法来实现我的目标。
剪辑
我提出的解决方案在源脚本调用 exit
的情况下不起作用,因此我必须捕获退出
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
...
}
. script.sh
调用了 run_tests
函数,但是只要我重定向源命令的输出,脚本中的函数就不会被解析,陷阱处理程序中的函数也不可用
这样可以,但是我得到了 script.sh
的输出:
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
function_defined_in_script_sh
}
. script.sh
这不打印输出,但我得到一个错误,该函数没有定义:
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
function_defined_in_script_sh
}
. script.sh | grep OUTPUT_THAT_DOES_NOT_EXISTS
这不会打印输出,也不会调用 run_tests
陷阱处理程序:
#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
function_defined_in_script_sh
}
. script.sh > /dev/null