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代码).
问题出在哪儿?我究竟做错了什么?
退出状态
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/ ... 抓住百分比并将其保存 pcntEND ... 退出基于的代码 pcnt这不仅会打印所有发出的行coverage report,还会确保管道的退出代码反映覆盖百分比逻辑.