Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fish shell评估生成返回代码_Shell_Unit Testing_Makefile_Fish - Fatal编程技术网

fish shell评估生成返回代码

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运

我正在尝试用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
但这有两个问题:

  • 当我需要管标准件时,我显然在管标准件。(想想看,如果我能检查一下是否有任何东西被写入了stderr,那么我就根本不需要grep了。)
  • Grep正在吞下所有通过管道传输到它的日志数据,我真的很想在控制台上看到这些数据

  • 你误解了括号-这些括号有点长。这样做的目的是捕获在替换中运行的进程的输出,然后将其用作外部进程的参数(默认情况下以换行符分隔)

    这意味着您的
    测试将收到
    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