终端和 Grepping Stderr:如何运行详细代码并 grep 标准错误而不更改其他任何内容?

终端和 Grepping Stderr:如何运行详细代码并 grep 标准错误而不更改其他任何内容?

假设我有一段代码,并且它以非常详细的模式运行。这种最冗长的内容暴露了一条消息,我想阅读该消息以了解一切的进展情况。然而,终端上充斥着其他内容。

有没有办法在不将 stderror 管道转换到 stdout 管道的情况下 grep 过滤 stderror 输出?

例如,

my-command 2>&1 | grep something # ok, great; is it possible without the pipe shift?

这可能吗?

i.e., maybe
my-command 2>(grep something)?

答案1

我将这两个选项作为答案,即使它们并没有真正回答问题(答案是“在 bash 中,否”),以防其他人看到这个,并展示交换 stdout 和 stderr 的方法,并确保格式正确(与注释中不同)。

答案一:假设这是一个您想要运行的程序(我知道它看起来不像命令,但假装它是;替换全部其中包含您实际想要运行的命令和参数):

{ echo stdout; echo stderr >&2; }

现在假设您只想 grep 某些内容的 stderr,但保持 stdout 不变。

{ echo stdout; echo stderr >&2; } 2> >(grep something)

如果那是全部你这样做了,你会得到所有的标准输出,以及其中包含某些内容的部分标准错误,所有这些都散布在其中。您可能希望将 stdout 和 stderr 写入单独的文件以供以后查看:

{ echo stdout; echo stderr >&2; } 2> >(grep something > errorfile) > outputfile

对于交换 stdout 和 stderr (以及为什么你想这样做)请参阅https://stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderr以获得比我能给出的更好的解释。

相关内容