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

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

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

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

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

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

我应该怎么理解呢? 我认为他们是一样的!

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

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

所以如果你写./a.out 2>& >outfile ,那么标准输出描述符首先被复制到stderr描述符,然后stdout被重定向到outfile。

如果你喜欢,你可以看到这些重定向操作符:

  • 2>& >file将被读为fd2 := fd1; fd1 := "file" fd2 := fd1; fd1 := "file" ,这是不一样的
  • >file 2>&fd1 := "file"; fd2 := fd1 fd1 := "file"; fd2 := fd1

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

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