fish shell评估返回代码

时间:2015-12-16 20:01:33

标签: shell unit-testing makefile fish

我试图在Fish中编写一个运行Make配方的脚本,然后执行所有生成的二进制文件。我遇到的问题是,如果make命令遇到错误,我希望脚本退出并带有错误代码。每当我尝试捕获Make的返回值时,我最终会得到它的输出日志。

例如:

if test (make allUnitTests) -eq 0
    echo "success"
else
    echo "fail"
end

返回错误,因为" test"正在看构建过程,而不是终止条件。

我编写了脚本,以便每当触发构建时,我都可以轻松地让Jenkins运行所有单元测试。由于我还没有能够使脚本的上述部分正常工作,我已经指示Jenkins将make命令作为单独的命令运行,这正是我想要的:停止整个构建过程如果有任何无法编译的话,不执行任何二进制文件因此,在这一点上,我的问题更多的是学术练习,但我想将单元测试二进制文件添加到脚本中(并使其干净地终止于构建错误),以便任何人可能检查出来代码,并希望运行单元测试。

我玩了一些类似的东西:

if test (count (make allUnitTests | grep "Stop")) -eq 0

但这有两个问题:

  1. 当我需要管道stderr时,我显然是管道stdout。 (想想看,如果我能检查是否有任何东西写入stderr,那么我根本不需要grep。)
  2. Grep正在吞咽所有传输到它的日志数据,我真的希望在控制台上看到它。

1 个答案:

答案 0 :(得分:5)

你误解了括号 - 它们运行command substitution。这样做是捕获在替换中运行的进程的输出,然后它将作为参数(默认情况下由换行符分隔)用于外部进程。

这意味着您的test将获得make的完整输出。

你想要做的只是运行if make allUnitTests而没有任何问题,因为你只对返回值感兴趣。

如果您想在运行make和检查其返回值之间执行某些操作,则“$ status”变量始终包含最后一个命令的返回值,因此您可以保存:

make allUnitTests
set -l makestatus $status
# Do something else
if test $makestatus -eq 0
   # Do the if-thing
else
   # Do the else-thing
end