如果我输入
cat > file.txt 2>&1
then是用的标准输入file.txt
的内容创建的。cat
但如果我这样做
cat > file.txt 1>&2
然后file.txt
创建了,但文件是空的。
上述两个命令之间有什么问题?
答案1
顺序很重要。 shell 处理文件重定向按照它看到它们的顺序。 考虑:
cat >file.txt 2>&1
首先,stdout 被重定向到文件file.txt
。接下来,stderr 被重定向到 stdout,即file.txt
.因此 stdout 和 stderr 都被发送到file.txt
.
相比之下,请考虑:
cat >file.txt 1>&2
首先,stdout 被重定向到文件file.txt
。 (这样做时,file.txt
被创建为一个空文件。)接下来,stdout 被重定向到 stderr。因此,stdout 转到 stderr,但没有任何内容file.txt
,因此file.txt
仍保留为空文件。
另一个有趣的案例
考虑:
cat 2>&1 >file.txt
首先,stderr 被重定向到 stdout,它仍然是终端。接下来,stdout 被重定向到file.txt
.第二次重定向不会影响 stderr。它仍然被发送到终端。这是不是发给file.txt
。
文档
此行为记录在man bash
:
重定向按照它们出现的顺序从左到右进行处理。
此顺序的一个例外是管道,该顺序也记录在 中man bash
。考虑:
command1 ... | command2
的标准输出command1
由管道发送到 的标准输入,command2
并执行此连接
前第一个命令指定的任何重定向。
管道示例
考虑:
command1 >file.txt | command2
因为重定向到file.txt
发生后重定向到管道, stdoutcommand1
将转到file.txt
. command2
将不会收到任何输入。
答案2
执行“> file”实际上是执行“1> file”。所以你要做的就是将文件描述符 1 重定向两次。只有最后一个生效。