我无法理解这两种情况之间的区别:
./a.out > outfile 2>&
我可以在outfile中看到标准输出和错误输出
./a.out 2>& > outfile
我只能看到标准输出int outfile,并在屏幕上打印错误输出
我应该怎么理解呢? 我认为他们是一样的!
n> file
创建/截断file
并将其关联到文件描述符n
。 如果没有指定n
,则假定为1
(即标准输出)。
n>&m
复制(使用dup2()
)文件描述符m
到n
。
所以如果你写./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”将标准输出和标准错误输出都指向“文件”。