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

ale*_*nst 1 linux bash awk tee pipestatus

我有这个命令:

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

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

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

问题出在哪儿?我究竟做错了什么?

cod*_*ter 6

退出状态

command | tee >(...)
Run Code Online (Sandbox Code Playgroud)

tee无论过程替换 内发生什么,都将是退出状态>(...).这就是你的代码无法正常工作的原因.

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

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

这不仅会打印所有发出的行coverage report,还会确保管道的退出代码反映覆盖百分比逻辑.