在附加到 tee 的重定向中获取嵌套命令的退出状态
Getting the exit status of a nested command inside a redirect attached to tee
我有这个命令:
coverage report | tee >(grep TOTAL | awk '{exit (int() >= 75)?0:1}') && (exit ${PIPESTATUS[0]})
报告代码覆盖率,然后将输出打印到 stdout
并将相同的输出重定向到 grep + awk,它主要检查代码覆盖率是小于还是大于 75
。最后,子外壳中有一个 exit
,我假装在我的 CI/CD 管道中使用它。
问题是我的 CI/CD 总是成功完成,这不应该发生,因为在我的测试中代码覆盖率低于 75%。这意味着 PIEPSTATUS
不是 return 我期望的 return(awk 的 exit
代码)。
问题出在哪里?我做错了什么?
的退出状态
command | tee >(...)
将是 tee
的退出状态,而不管 process substitution >(...)
内部发生了什么。这就是您的代码无法正常工作的原因。
您无需使用流程替换即可实现您的目标,如下所示:
coverage report | awk '{print} /TOTAL/ { pcnt= } END {exit (int(pcnt) >= 75) ? 0 : 1}')
{print}
打印所有行
/TOTAL/ ...
抓取百分比并将其保存在 pcnt
END ...
退出代码基于 pcnt
这不仅会打印 coverage report
发出的所有行,还会确保管道的退出代码反映覆盖百分比逻辑。
我有这个命令:
coverage report | tee >(grep TOTAL | awk '{exit (int() >= 75)?0:1}') && (exit ${PIPESTATUS[0]})
报告代码覆盖率,然后将输出打印到 stdout
并将相同的输出重定向到 grep + awk,它主要检查代码覆盖率是小于还是大于 75
。最后,子外壳中有一个 exit
,我假装在我的 CI/CD 管道中使用它。
问题是我的 CI/CD 总是成功完成,这不应该发生,因为在我的测试中代码覆盖率低于 75%。这意味着 PIEPSTATUS
不是 return 我期望的 return(awk 的 exit
代码)。
问题出在哪里?我做错了什么?
command | tee >(...)
将是 tee
的退出状态,而不管 process substitution >(...)
内部发生了什么。这就是您的代码无法正常工作的原因。
您无需使用流程替换即可实现您的目标,如下所示:
coverage report | awk '{print} /TOTAL/ { pcnt= } END {exit (int(pcnt) >= 75) ? 0 : 1}')
{print}
打印所有行/TOTAL/ ...
抓取百分比并将其保存在pcnt
END ...
退出代码基于pcnt
这不仅会打印 coverage report
发出的所有行,还会确保管道的退出代码反映覆盖百分比逻辑。