bash:重定向输出混乱

时间:2014-02-16 06:47:26

标签: c++ bash scripting stdout stderr

当我执行此命令时(其中fail.cpp是一个充满编译器错误的简单程序),错误不会直接在屏幕上输出,而是在fail.out文件中输出:

g++ fail.cpp > fail.out 2>&1

从我对bash的介绍性理解中,这是有道理的:>将程序输出(stdout,又名1)重定向到fail.out,而2>&1将stderr(又名2)重定向到这个新地方对于stdout,这是文件。 (?)

但改变命令的顺序会使事情发生不同:

g++ fail.cpp 2>&1 > fail.out

现在,错误消息直接进入屏幕,而fail.out是一个空白文件。

这是为什么?它看起来与上面的想法相同:将此命令将产生的错误重定向到stdout(2>&1),然后将其重定向到fail.out文件。这是我失踪的操作顺序吗?

1 个答案:

答案 0 :(得分:7)

2>&1表示“将stderr重定向到stdout当前连接的位置”,并且按从左到右的顺序处理重定向。所以第一个做:

  1. 将stdout重定向到fail.out文件。
  2. 将stderr重定向到stdout的当前连接,即fail.out文件
  3. 第二个做:

    1. 将stderr重定向到stdout的当前连接,即终端。
    2. 将stdout重定向到fail.out文件。