对于我的操作系统类,我们必须实现一个类似于 shell 的程序。我遇到了一个我不知道如何解释的例子:
echo "test" > out1 > out2
运行此程序后,将创建 out1 和 out2 但 out1 为空且 out2 包含“test”。
在我启动 echo 进程并将要打印的 stdout 修改为 out1 之后,接下来会发生什么?
对于我的操作系统类,我们必须实现一个类似于 shell 的程序。我遇到了一个我不知道如何解释的例子:
echo "test" > out1 > out2
运行此程序后,将创建 out1 和 out2 但 out1 为空且 out2 包含“test”。
在我启动 echo 进程并将要打印的 stdout 修改为 out1 之后,接下来会发生什么?
重定向是从左到右处理的:首先> out1
(创建out1
文件描述符#1并将其连接到它),然后> out2
(创建out2
文件描述符#1并将其连接到它,取代前一个)。所以它实际上只是为两个不同的文件做两次完全相同的事情(close(1)
加fd = open(...)
号)。dup(fd)
编辑添加:正如Bash 参考手册 所说:
重定向按照它们出现的顺序进行处理,从左到右。
正如 POSIX所说:
如果一个命令指定了多个重定向运算符,则计算顺序为从开始到结束。
当然,这些解释仅适用于重定向确实在同一个简单命令中的情况。像这样的东西:
{ echo test > out1 ; } > out2
实际上会写入test
并out1
留空out2
,因为重定向{}
发生在echo test > out1
运行之前。