为什么描述符重定向看起来不一致?

时间:2011-03-14 20:14:11

标签: bash

  • 我们大多数人都知道要将STDERR重定向到STDOUT,我们会2>&1
  • 我们也知道使用“>”的文件重定向和使用“|”处理重定向

我一直想知道的是关于上述两个的组合

如果要将 prog1 的STDERR和STDOUT重定向到 prog2 ,请将2>&1放在|prog2管道之前。另一方面,如果您将prog1的STDERR和STDOUT重定向到文件(file.txt),则2>&1会在> file.txt之后。

所以我知道怎么做,我只是想知道为什么这样做。对我来说似乎不一致,但我可能会以错误的方式看待它

由于

2 个答案:

答案 0 :(得分:5)

按顺序处理它们。

所以,如果你这样做

progname 2>&1 1>out.txt

将stderr 从程序转移到程序stdout的当前目标,这是shell的stdout流 ,并转移程序的标准输出到out.txt。

如果你这样做

progname 1>out.txt 2>&1 

将程序的标准输出转移到out.txt,然后将stderr 从程序转移到程序标准输出的当前目标,即out.txt

答案 1 :(得分:1)

如果您不将管道视为重定向,则会有所帮助。使用2>&1,您将stderr重定向到stdout。只有stdout通过管道。如果你在管道之前重定向stdout,那么没有任何东西可以通过。