我有一个输出到 stdout 和 stderr 的程序,但没有以正确的方式使用它们。一些错误进入 stdout,一些进入 stderr,非错误内容进入 stderr,它会在 stdout 上打印很多信息。为了解决这个问题,我想做一个管道:
$cmd
将(来自 stderr 和 stdout)的所有输出保存到文件中$logfile
(不要将其打印到屏幕上)。- 过滤掉 stderr 和 stdout 上的所有警告和错误消息(从警告|错误到空行)并仅着色“错误”字词(将输出重定向到 stderr)。
- 将步骤 2 的输出保存到文件
$logfile:r.stderr
中。 - 使用命令中的正确退出代码退出。
到目前为止,我有这个:
$!/bin/zsh
# using zsh 4.2.0
setopt no_multios
# Don't error out if sed or grep don't find a match:
alias -g grep_err_warn="(sed -n '/error\|warning/I,/^$/p' || true)"
alias -g color_err="(grep --color -i -C 1000 error 1>&2 || true)"
alias -g filter='tee $logfile | grep_err_warn | tee $logfile:r.stderr | color_err'
# use {} around command to avoid possible race conditions:
{ eval $cmd } 2>&1 | filter
exit $pipestatus[1]
我已经尝试了很多东西,但无法让它发挥作用。我已经阅读了“从 Bash 到 Z Shell”、许多帖子等。我目前的问题是:
- 只有标准输入进入过滤器
注意:这$cmd
是一个 shell 脚本,它调用带有/usr/bin/time -p
前缀的二进制文件。这似乎会导致管道出现问题,这就是为什么我将命令包装在{…}
所有输出进入管道中的原因。