【发布时间】:2011-06-10 21:00:47
【问题描述】:
我有一个输出到 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 前缀的二进制文件。这似乎会导致管道出现问题,这就是我将命令包装在 {…} 中的原因,所有输出都进入管道。
【问题讨论】:
标签: bash zsh io-redirection