标准输出和错误中的问题

标准输出和错误中的问题

如果我输入

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 重定向两次。只有最后一个生效。

相关内容