我无法理解这两种情况之间的区别:
./a.out > outfile 2>&
我可以在outfile中看到标准输出和错误输出
./a.out 2>& > outfile
我只能看到标准输出int outfile,并在屏幕上打印错误输出
我应该如何理解这一点? 我认为他们是一样的!
答案 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“将标准输出和标准错误输出都指向”文件“。