fish shell 评估 make return 代码

fish shell evaluate make return code

我正在尝试用 Fish 编写一个脚本,运行 是一个 Make 配方,然后执行所有生成的二进制文件。我遇到的问题是,如果 make 命令遇到错误,我想让脚本退出并显示错误代码。每当我尝试捕获 Make 的 return 值时,我都会得到它的输出日志。

例如:

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

return是一个错误,因为 "test" 看到的是构建过程,而不是终止条件。

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

我玩了一些类似的东西:

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

但这有两个问题:

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

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

这意味着您的 test 将收到 make 的完整输出。

你想要做的只是 运行 if make allUnitTests 没有任何括号,因为你只对 return 值感兴趣。

如果您想在 运行 宁 make 和检查其 return 值之间执行某些操作,“$status”变量始终包含 return 值最后一个命令,所以你可以保存它:

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