Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何将stderr重定向到stdout,反之亦然_Bash - Fatal编程技术网

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

Bash 如何将stderr重定向到stdout,反之亦然,bash,Bash,我正在从bash脚本调用第三方二进制可执行文件,但出于某种奇怪的原因,可执行文件将其信息消息写入stderr,将其错误消息写入stdout。(我想这是一个bug…) 调用可执行文件时,如何反转此行为 我试过了 callExecutable 1>&2 2>&1 但这似乎会将所有输出重定向到stderr,而不会将任何输出重定向到stdout。 我可能需要一个中间步骤?将输出视为属于框(流),如果执行2>&1,则输出2将与输出1位于同一框中,因此当执行1>&2时,所有内

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

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

我试过了

callExecutable  1>&2 2>&1
但这似乎会将所有输出重定向到
stderr
,而不会将任何输出重定向到
stdout

我可能需要一个中间步骤?

将输出视为属于框(流),如果执行
2>&1
,则输出
2
将与输出
1
位于同一框中,因此当执行
1>&2
时,所有内容都返回到错误流


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

您可以使用另一个文件描述符交换
stderr
stdout

callExecutable 3>&1 1>&2 2>&3
将其视为在编程中使用临时变量交换两个其他变量:

temp = x
x = y
y = temp
这里有一个非常有用的站点,详细介绍了一些重定向。

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

这使

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

这确实起到了作用。不幸的是,我只能接受一个答案。
callExecutable 3>&1 1>&2 2>&3