Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Linux 获取附加到tee的重定向中嵌套命令的退出状态_Linux_Bash_Awk_Tee_Pipestatus - Fatal编程技术网

Linux 获取附加到tee的重定向中嵌套命令的退出状态

Linux 获取附加到tee的重定向中嵌套命令的退出状态,linux,bash,awk,tee,pipestatus,Linux,Bash,Awk,Tee,Pipestatus,我有这个命令: coverage report | tee >(grep TOTAL | awk '{exit (int($4) >= 75)?0:1}') && (exit ${PIPESTATUS[0]}) 它报告代码覆盖率,然后将输出打印到stdout,并将相同的输出重定向到grep+awk,后者基本上检查代码覆盖率是否小于或大于75。最后,在子shell中有一个出口,我假装在我的CI/CD管道中使用它 问题是我的CI/CD总是成功完成,这不应该发生,因为在我

我有这个命令:

coverage report | tee >(grep TOTAL | awk '{exit (int($4) >= 75)?0:1}') && (exit ${PIPESTATUS[0]})
它报告代码覆盖率,然后将输出打印到
stdout
,并将相同的输出重定向到grep+awk,后者基本上检查代码覆盖率是否小于或大于
75
。最后,在子shell中有一个
出口
,我假装在我的CI/CD管道中使用它

问题是我的CI/CD总是成功完成,这不应该发生,因为在我的测试中代码覆盖率低于75%。这意味着
PIEPSTATUS
没有返回我期望它返回的内容(awk的
exit
code)

问题在哪里?我做错了什么?

的退出状态

command | tee >(...)
将是
tee
的退出状态,而不管
>(…)
内部发生了什么。这就是你的代码不起作用的原因

无需使用流程替代即可实现目标,如下所示:

coverage report | awk '{print} /TOTAL/ { pcnt=$4 } END {exit (int(pcnt) >= 75) ? 0 : 1}')
  • {print}
    打印所有行
  • /TOTAL/…
    获取百分比并将其保存在
    pcnt
  • END…
    基于
    pcnt退出代码
这不仅将打印覆盖率报告发出的所有行,还将确保管道的退出代码反映覆盖率百分比逻辑。

的退出状态

command | tee >(...)
将是
tee
的退出状态,而不管
>(…)
内部发生了什么。这就是你的代码不起作用的原因

无需使用流程替代即可实现目标,如下所示:

coverage report | awk '{print} /TOTAL/ { pcnt=$4 } END {exit (int(pcnt) >= 75) ? 0 : 1}')
  • {print}
    打印所有行
  • /TOTAL/…
    获取百分比并将其保存在
    pcnt
  • END…
    基于
    pcnt退出代码

这不仅将打印覆盖率报告发出的所有行,还将确保管道的退出代码反映覆盖率百分比逻辑。

为什么在子shell
(…)
中运行
退出${PIPESTATUS[0]}
?因为我想设置退出代码,因此CI/CD将对其进行操作。的可能重复,等等。您为什么在子shell中运行
exit${PIPESTATUS[0]}
(…)
?因为我想设置退出代码,以便CI/CD对其进行操作。的可能重复,等等。是的,这完全简化了我的代码,并完全按照预期工作。非常感谢。是的,这完全简化了我的代码,并且完全按照预期工作。非常感谢。