我正在通过 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
基本上是这样的:
- 将管道的返回状态设置为以非零状态退出的最后一个命令的值,如果所有命令都成功退出,则设置为零。
- 复制
stderr
来自stdout
with2&>1
(或其简写)|&
然后传递stdin
给tee
- 在 中进行复制时调用
tee
将其复制stdin
到。stdout
artifact.txt
- 恢复原始管道设置。
我不得不忍受这两种情况stdout
并被stderr
复制到文件中,因为显然,Bash 没有允许仅通过管道传输stderr
到第二个命令的速记语法。
其他参考:
答案2
在bash
你可以运行:
$ somecommand 2>&1 | tee ./artifact.txt;echo "${PIPESTATUS[@]}"
并获取整个管道的退出代码。