繁体   English   中英

在 bash 中同时传输标准输出和标准错误?

[英]Piping both stdout and stderr in bash?

似乎较新版本的 bash 具有&>运算符,它(如果我理解正确的话)将 stdout 和 stderr 都重定向到一个文件(如 Adrian 澄清的那样,将&>>附加到文件中)。

什么是实现同样的事情的最简单方法,而不是管道到另一个命令?

例如,在这一行中:

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError

我希望 grep 匹配 stdout 和 stderr 中的内容(实际上,将它们合并为一个流)。

注意:这个问题是关于管道,而不是重定向 - 所以它不是它当前被标记为重复的问题的重复。

(请注意, &>>file附加到文件,而&>将重定向并覆盖以前存在的文件。)

要结合stdoutstderr您可以使用2>&1将后者重定向到前者。 这会将 stderr(文件描述符 2)重定向到 stdout(文件描述符 1),例如:

$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$

stdout转到 stdout, stderr转到 stderr。 grep只看到stdout ,因此stderr打印到终端。

另一方面:

$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$

写入 stdout 和 stderr 后, 2>&1将 stderr 重定向回 stdout, grep在 stdin 上看到两个字符串,从而过滤掉两者。

您可以在此处阅读有关重定向的更多信息。

关于您的示例(POSIX):

cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError

或者,使用>=bash-4

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

Bash 有2>&1 |的简写 ,即|& ,它同时传输 stdout 和 stderr (参见手册):

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

这是在 Bash 4.0 中引入的,请参阅发行说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM