如何在打印到 STDERR 之前修改并写入文件

如何在打印到 STDERR 之前修改并写入文件

我正在通过 GitHub 操作进行自动拉取请求检查,并且我想在作业之间保留命令stderr输出中的一些数据。

为此,我需要stderr人工制品文件,但在此之前我还需要通过 从中删除一些控制字符sed,否则我最终会得到类似的结果:

\x1b[31mFound 344 errors!\x1b[39;49m

然后,我希望主命令返回相同的退出代码,以使检查失败并防止合并拉取请求。

我可能可以处理需要做的事情的一个子集,但无法一起处理所有 3 个事情(sed > file write > stderr)。如果这样更容易,我也可以将 和 写入stdout文件stderr

接受以不同方式做到这一点的建议。

答案1

我能够使用 shell 重定向运算符的组合来解决这个问题tee效用和pipefail外壳选项:

set -o pipefail; somecommand 2&>1 | tee ./artifact.txt; set +o pipefail

基本上是这样的:

  1. 将管道的返回状态设置为以非零状态退出的最后一个命令的值,如果所有命令都成功退出,则设置为零。
  2. 复制stderr来自stdoutwith2&>1(或其简写)|&然后传递stdintee
  3. 在 中进行复制时调用tee将其复制stdin到。stdoutartifact.txt
  4. 恢复原始管道设置。

我不得不忍受这两种情况stdout并被stderr复制到文件中,因为显然,Bash 没有允许仅通过管道传输stderr到第二个命令的速记语法。


其他参考:

答案2

bash你可以运行:

$ somecommand 2>&1 | tee ./artifact.txt;echo "${PIPESTATUS[@]}"

并获取整个管道的退出代码。

相关内容