我对 Linux 如何处理重定向运算符感到有点困惑。
我的主目录中只有一个文件:
andy$: ls
demo.mp4
现在,如果我将ls
输出发送到文件,我应该只能demo.mp4
在该文件中看到,因为目录中除了该文件之外没有任何内容:
andy$: ls > myfile
但我实际上注意到myfile
包含本身!
andy$ cat myfile
demo.mp4
myfile <-- ???
所以这意味着ls
被执行后的创造myfile
?
就像是:
- 创造
myfile
- 列出目录内容
ls
- 将内容(现在
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