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对其进行操作。的可能重复,等等。是的,这完全简化了我的代码,并完全按照预期工作。非常感谢。是的,这完全简化了我的代码,并且完全按照预期工作。非常感谢。