fish shell评估生成返回代码
我正在尝试用Fish编写一个脚本,运行Make配方,然后执行所有生成的二进制文件。我遇到的问题是,如果make命令遇到错误,我希望脚本退出时带有错误代码。每当我试图捕获Make的返回值时,我都会得到它的输出日志 例如:fish shell评估生成返回代码,shell,unit-testing,makefile,fish,Shell,Unit Testing,Makefile,Fish,我正在尝试用Fish编写一个脚本,运行Make配方,然后执行所有生成的二进制文件。我遇到的问题是,如果make命令遇到错误,我希望脚本退出时带有错误代码。每当我试图捕获Make的返回值时,我都会得到它的输出日志 例如: if test (make allUnitTests) -eq 0 echo "success" else echo "fail" end 返回错误,因为“test”看到的是生成过程,而不是终止条件 我编写了这个脚本,以便在触发构建时可以轻松地让Jenkins运
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
但这有两个问题:
你误解了括号-这些括号有点长。这样做的目的是捕获在替换中运行的进程的输出,然后将其用作外部进程的参数(默认情况下以换行符分隔) 这意味着您的
测试将收到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
你误解了括号-这些括号有点长。这样做的目的是捕获在替换中运行的进程的输出,然后将其用作外部进程的参数(默认情况下以换行符分隔)
这意味着您的测试将收到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
假设fish与大多数shell一样工作,那么如果make allUnitTests\n echo success\n else\n echo fail\n end
,您只需要(command)
成为命令的输出,但您只需要返回代码。实际上,bash使用$?
保持最后一个命令的退出状态,虽然fish使用$status
假设fish与大多数shell一样工作,但如果make allUnitTests\n echo success\n else\n echo fail\n end
,您只需要(command)
成为命令的输出,但您只需要返回代码。实际上,bash使用$?
来保持最后一个命令的退出状态,而fish使用$status
也可以使用^
,比如生成allUnitTests^ | grep err
,也可以使用管道stderr,使用^ |
,如进行测试^ | grep err
。