如何将标准错误输出重定向到标准输出,反之亦然

3

我正在从一个bash脚本中调用第三方二进制可执行文件,但由于某种奇怪的原因,该可执行文件将其信息消息写入stderr,将错误消息写入stdout。(我想这是一个错误...)

在调用可执行文件时,如何反转这种行为呢?

我尝试过以下操作:

callExecutable  1>&2 2>&1

但是这似乎将所有输出都重定向到 stderr 而没有输出到 stdout。我可能需要一个中间步骤?
3个回答

4
你可以使用另一个文件描述符来交换 stderrstdout
callExecutable 3>&1 1>&2 2>&3

就像在编程中使用一个临时变量来交换另外两个变量一样:

temp = x
x = y
y = temp

这是一个非常有用的网站,详细介绍了一些与bash one-liners相关的内容。

2
您需要使用另一个文件描述符作为“临时变量”,而不是两个重定向,共计三次重定向。
callExecutable 3>&1 1>&2 2>&3

这将会发送:
  • FD 3 到 FD 1 (stdout) 的当前目的地
  • FD 1 到 FD 2 (stderr) 的当前目的地
  • FD 2 到 FD 3 的当前目的地(由于第一个重定向,FD 3 现在是 stdout)

确实如此。不幸的是,我只能接受一个答案。 - jeroen_de_schutter

1
将输出视为属于框(流),如果您执行2>&1,那么输出2将与输出1在同一个框中,因此当您执行1>&2时,所有内容都会返回到错误流。
解决方法是使用另一个文件描述符。序列3>&2 2>&1 1>&3可以实现您所要求的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接