IO-Redirection Operator 何时执行?

IO-Redirection Operator 何时执行?

我对 Linux 如何处理重定向运算符感到有点困惑。

我的主目录中只有一个文件:

andy$: ls
demo.mp4

现在,如果我将ls输出发送到文件,我应该只能demo.mp4在该文件中看到,因为目录中除了该文件之外没有任何内容:

andy$: ls > myfile

但我实际上注意到myfile包含本身!

andy$ cat myfile
demo.mp4
myfile <-- ???

所以这意味着ls被执行的创造myfile

就像是:

  1. 创造myfile
  2. 列出目录内容ls
  3. 将内容(现在myfile存在)写入myfile文件中

因此,如果我需要排除我重定向到的文件,我想我应该这样做:

ls | grep -v "myfile" > myfile

首先,我说得对吗?

如果是这样,为什么?我在哪里可以找到更多这方面的信息?

答案1

是的你是对的。

shell 在运行命令之前执行重定向。当 shell 运行命令时,它会根据需要设置新命令的标准输入、输出和错误。默认情况下,它们连接到终端(或 shell 连接到的任何东西)。当存在重定向时,相关的文件描述符将连接到相应的文件(或管道等)。没有缓冲等 - 因此 shell 不会累积程序的输出并且然后将其写入文件;它将程序的输出连接到文件并处理所有事情。

这意味着需要在运行命令之前打开文件。

您可以在以下位置了解更多相关信息:关于 shell 语言的 POSIX 章节。第一部分列出了 shell 在运行命令之前执行的操作顺序;您会看到重定向发生在命令执行之前。

答案2

由于ls是以打开的文件作为 stdout 启动的,因此显然需要在ls程序执行之前创建该文件。

如果您想获得更多信息,您可以查看 shell 的 POSIX 标准:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html

以及shell命令语言的说明:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18

相关内容