为什么描述符重定向似乎不一致?

3
  • 我们大多数人都知道将 STDERR 重定向到 STDOUT,我们会使用 2>&1
  • 我们也知道使用 ">" 进行文件重定向和使用 "|" 进行进程重定向

我一直想知道的是上述两者的组合方式

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

所以我知道如何做,但我想知道为什么要这样做。对我来说,它似乎不一致,但我可能看错了

谢谢


我建议使用 &> file.txt|& prog2 来减少一些奇怪的感觉。 - freiheit
2个回答

5
它们按顺序处理。
所以如果你执行
progname 2>&1 1>out.txt

这将把程序的标准错误输出(stderr)从程序中转移,并输出到程序标准输出(stdout)当前的目标位置,也就是shell的stdout流。同时,将程序的标准输出(stdout)输出到out.txt文件中。

如果执行以下命令:

progname 1>out.txt 2>&1 

这将标准输出重定向到out.txt文件,然后将程序的标准错误从程序中重定向到程序当前标准输出的目的地,即out.txt。


1

如果你不把管道看作是重定向,那么它会有所帮助。使用 2>&1,你将 stderr 重定向到 stdout。只有 stdout 经过管道。如果在管道之前重定向 stdout,则没有任何内容经过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接