将std错误redirect到文件时,2>&1的顺序

我看到一些不同的格式将std输出redirect到一个文件:

a. command 1&2>output.txt b. command >output.txt 2>&1 c. command 2>&1>output.txt d. command &>output.txt 

这些有什么区别? 如果2>&1放在结尾(b),它如何redirect第一个命令的stderr?

是。 订单很重要。 >可以提出指向和指针/引用的概念,“重定向”这个词也是如此,但是fd重定向更像是指派。 也就是说,如果你这样做

exec 2>&1 1>output.txt

它将文件描述符1的当前“值”(该文件描述符打开的实际文件)“分配”到文件描述符2 ,然后打开output.txt并将其分配给文件描述符1

它不会做的是&2 (读取&“文件描述符”)到&1 。 它不会访问&2查询&1 。 一个文件描述符只与一个实际的文件关联,从来没有与另一个文件描述符关联。 2>&1将在&1下打开的文件与&2关联起来。 它不会重定向&2&1 ,因为写入&2会使其写入&1当前关联的内容。 &1以后可以重新打开一个与2>&1重定向时关联的文件不同的文件,但这不会影响写入的内容。

如果想知道在系统调用级别如何显示此功能,请查看dup2(2) 。