【问题标题】:bash: Confusion with redirecting outputbash:与重定向输出混淆
【发布时间】:2014-02-16 06:47:25
【问题描述】:

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

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

根据我对 bash 的初步理解,这是有道理的:> 将程序输出(stdout,a.k.a. 1)重定向到 fail.out,而 2>&1 将 stderr(a.k.a. 2)重定向到 stdout 的这个新位置,这是文件。 (?)

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

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

现在,错误信息直接显示在屏幕上,fail.out 是一个空白文件。

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

【问题讨论】:

标签: c++ bash scripting stdout stderr


【解决方案1】:

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

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

第二个:

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

【讨论】:

  • 所以,可以肯定的是,>>&1 的含义相同?
  • 没有。 >filename 表示重定向到filename>&1 表示重定向到 stdout 当前连接的位置。
  • 啊。也许我应该问,“>&1> 意思一样吗?
  • >1> 相同,<0< 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多