bash:重定向输出混淆

bash: Confusion with redirecting output

本文关键字:输出 重定向 bash      更新时间:2023-10-16

当我执行这个命令(其中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 文件。是我缺少的操作顺序吗?

2>&1的意思是"将stderr重定向到stdout当前连接的位置",重定向按从左到右的顺序处理。所以第一个是:

  1. 将标准输出重定向到 fail.out 文件。
  2. 将 stderr 重定向到 stdout 的当前连接,即 fail.out 文件

第二个是:

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