我应该如何理解“> outfile 2>& 1”和“2>& 1> outfile”?

时间:2014-08-10 14:50:49

标签: c linux shell unix

我无法理解这两种情况之间的区别:

  1. ./a.out > outfile 2>&

    我可以在outfile中看到标准输出和错误输出

  2. ./a.out 2>& > outfile

    我只能看到标准输出int outfile,并在屏幕上打印错误输出

  3. 我应该如何理解这一点? 我认为他们是一样的!

3 个答案:

答案 0 :(得分:8)

n> file创建/截断file并将其与文件描述符n相关联。如果未指定n,则假定为1(即标准输出)。

n>&m个(使用dup2())文件描述符m复制到n

因此,如果您编写./a.out 2>& >outfile,则首先将标准输出描述符复制到stderr描述符,然后将stdout重定向到outfile。

如果您愿意,可以将这些重定向运算符视为赋值:

  • 2>& >file将被视为fd2 := fd1; fd1 := "file",与
  • 不同
  • >file 2>&fd1 := "file"; fd2 := fd1

答案 1 :(得分:2)

按顺序应用重定向。在2>&1 > file中,第一个stderr将替换为stdout的副本,然后stdou t将替换为新打开的文件。将每个重定向视为C中的dup2调用。

答案 2 :(得分:0)

根据 Bash参考手册,“2>& 1>文件“仅将标准输出指向”文件“,因为标准错误输出是标准输出的副本;而“>文件2>& 1“将标准输出和标准错误输出都指向”文件“。