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

标签 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 中有一个 exit,我假装在我的 CI/CD 管道中使用它。

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

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

最佳答案

退出状态

command | tee >(...)

将是 tee 的退出状态,无论 process substitution 内部发生了什么>(...)。这就是您的代码无法正常工作的原因。

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

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

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

关于linux - 在附加到 tee 的重定向中获取嵌套命令的退出状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52959355/

相关文章:

awk - 仅当前一行具有另一个特定模式时才删除具有模式的行

linux - 找不到哪个USB端口是前面的

linux - BASH 对话框 动态菜单

linux - 将文本文件中的 block 写入多个新文件

linux - 查找包含另一个文件中所有单词/行的所有文件

bash - 除非在双引号中,否则用单个制表符替换空格

linux - 如何在 Perl 中使用 Image::Magic 增加特定像素的 RGB 值?

bash - 如何在 bash 中进行二进制加法

android - “adb”未被识别为命令

linux - 有没有办法在 bash 脚本中的 awk 语句中定义用户定义的函数?