鉴于“files.txt”是我的工作目录中的文件而“not-here”不是,我的问题是关于这个陈述:
ls files.txt not-here >out 2>&1
为什么在将合并结果重定向到 out 之前会合并 stdout 和 stderr?按照从左到右的顺序计算逻辑,我认为 stderr 的内容直到 stdout 已重定向到 out 之后才会重定向到 stdout。执行
ls files.txt not-here 2>&1 >out
似乎将两个流都重定向到 out 更有意义,因为您要将 stdout 和 stderr 的内容合并到 stdout,然后将 stdout 重定向到 out,但这只会重定向 stdout。似乎这里发生的事情的顺序与我的想法不一样。
答案1
操作员>&
是一个copy
操作员。2>&1
意思是,让文件描述符 2 成为文件描述符 1 的副本。
如果你这样做2>&1 >out
,当2>&1
执行时,fd 1 仍然是终端,fd 2 成为 fd1 的副本,因此 fd 2 成为终端。然后>out
执行时,fd 1 成为文件out
。
从Bash 手册:
ls 2>&1 > dirlist
仅将标准输出定向到文件 dirlist,因为在将标准输出重定向到 dirlist 之前,标准错误已成为标准输出的副本。