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

时间:2018-10-24 00:03:34

标签: linux bash awk tee pipestatus

我有以下命令:

coverage report | tee >(grep TOTAL | awk '{exit (int($4) >= 75)?0:1}') && (exit ${PIPESTATUS[0]})

报告代码覆盖率,然后将输出打印到stdout并将相同的输出重定向到grep + awk,后者基本上检查代码覆盖率是否小于或等于75。最后,在子外壳中有一个exit,我假装在我的CI / CD管道中使用。

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

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

1 个答案:

答案 0 :(得分:6)

退出状态

command | tee >(...)
不管enter image description here tee内部发生什么,

都是>(...)的退出状态。这就是您的代码无法正常工作的原因。

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

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

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