如何将stderr重定向到stdout,反之亦然

时间:2015-02-17 13:31:24

标签: bash

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

如何在调用可执行文件时反转此行为?

我试过

callExecutable  1>&2 2>&1

但这似乎会将所有输出重定向到stderr,而将所有输出重定向到stdout。 我可能需要一个中间步骤?

3 个答案:

答案 0 :(得分:4)

您可以使用其他文件描述符交换stderrstdout

callExecutable 3>&1 1>&2 2>&3

可以把它想象成使用temp变量在编程中交换其他两个变量:

temp = x
x = y
y = temp

这是一个非常有用的网站,详细介绍了一些bash one-liners

答案 1 :(得分:2)

你需要三个重定向而不是两个,使用另一个文件描述符作为“临时变量”

callExecutable 3>&1 1>&2 2>&3

发送

  • FD 3到FD 1(stdout)的当前目的地
  • FD 1到FD 2(stderr)的当前目的地
  • FD 2到FD 3的当前目的地(由于第一次重定向,现在是stdout)

答案 2 :(得分:1)

将输出视为属于框(流),如果您执行2>&1,则输出2将与输出1位于同一框中,因此当您执行{{1}时一切都回到了错误流。

解决方法是使用另一个文件描述符。序列1>&2完成了您的要求。