1

对于我的操作系统类,我们必须实现一个类似于 shell 的程序。我遇到了一个我不知道如何解释的例子:

echo "test" > out1 > out2

运行此程序后,将创建 out1 和 out2 但 out1 为空且 out2 包含“test”。

在我启动 echo 进程并将要打印的 stdout 修改为 out1 之后,接下来会发生什么?

4

1 回答 1

5

重定向是从左到右处理的:首先> out1(创建out1文件描述符#1并将其连接到它),然后> out2(创建out2文件描述符#1并将其连接到它,取代前一个)。所以它实际上只是为两个不同的文件做两次完全相同的事情(close(1)fd = open(...)号)。dup(fd)

编辑添加:正如Bash 参考手册 所说

重定向按照它们出现的顺序进行处理,从左到右。

正如 POSIX所说

如果一个命令指定了多个重定向运算符,则计算顺序为从开始到结束。

当然,这些解释仅适用于重定向确实在同一个简单命令中的情况。像这样的东西:

{ echo test > out1 ; } > out2

实际上会写入testout1留空out2,因为重定向{}发生在echo test > out1运行之前。

于 2013-03-06T01:37:03.890 回答