在我的桌面上,只有一个文件,它的名字是“file1.txt”,然后我执行shell脚本是这样的:
$ find . -name "*.txt" > file2.txt
之后,我像这样运行另一个 shell 脚本:
$ cat file2.txt
它的输出是:
./file1.txt
./file2.txt
所以看起来find
命令的执行是在文件“file2.txt”的创建之后,对吗?
你是对的; I/O 重定向发生在命令执行之前,因此在命令运行时find
文件file2.txt
已经存在(但为空) 。find
因此,该find
命令的输出将包括file2.txt
.
如果您考虑一下,这是有道理的。重定向必须在find
执行之前完成。您不能让它先写入终端然后再转到文件,即使有一种机制允许这样做。
你是对的:shellopen
首先是输出文件,然后创建它。然后它创建一个子进程fork
。然后 shell 关闭文件并等待子进程返回。子进程调用dup
或dup2
打开文件描述符为 1 的输出文件,然后它才使用该exec
系列的功能之一执行命令。