gpt4 book ai didi

bash - 如何使用 stdout 和 stderr io-redirection 从程序中获取理智的错误/警告消息输出?

转载 作者:行者123 更新时间:2023-11-29 09:26:48 28 4
gpt4 key购买 nike

我有一个程序输出到 stdout 和 stderr,但没有以正确的方式使用它们。一些错误转到 stdout,一些转到 stderr,非错误的东西转到 stderr,它在 stdout 上打印出很多信息。为了解决这个问题,我想做一个管道来做:

  1. $cmd 的所有输出(来自 stderr 和 stdout)保存到文件 $logfile(不要将其打印到屏幕)。
  2. 过滤掉 stderr 和 stdout 上的所有警告和错误消息(从 warning|error 到空行)并仅将“错误”字样着色(将输出重定向到 stderr)。
  3. 将步骤 2 的输出保存到文件 $logfile:r.stderr
  4. 使用命令中的正确退出代码退出。

到目前为止我有这个:

$!/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”、许多帖子等。我目前的问题是:

  1. 只有标准输入进入过滤器

注意:$cmd 是一个 shell 脚本,它调用带有 /usr/bin/time -p 前缀的二进制文件。这似乎会导致管道出现问题,这就是为什么我将命令包装在 {...} 中,所有输出都进入管道。

最佳答案

我没有可用的 zsh。

我确实注意到您的 {..} 陈述不正确。

在结束的`}'之前你总是需要一个分号。

当我在 bash 中添加它时,我可以满意地证明 stderr 被重定向到 stdout。

尝试

{ eval $cmd ; } 2>&1 | filter
# ----------^

还有,你写了

Save all output of $cmd (form stderr and stdout) to a file $logfile

我在您的代码中没有看到任何提及 $logfile 的地方。您应该能够将所有输出放入日志文件(同时失去 stderr 流的特殊性),

yourCommand 2>&1 | tee ${logFile} | ....

希望对您有所帮助。

附言由于您似乎是新用户,如果您得到的答案对您有帮助,请记住将其标记为已接受,和/或给它一个 +(或 -)作为有用的答案。

关于bash - 如何使用 stdout 和 stderr io-redirection 从程序中获取理智的错误/警告消息输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6312027/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com