为什么这个命令(创建一个空文件夹,更改为它,触摸文件,调用ls
然后cat
),显示两个文件?
root@ubuntu:~# mkdir a ; cd a ; touch b ; ls > c ; cat c
b
c
我相信我应该只得到“b”。
答案 0 :(得分:5)
当您将ls
的输出重定向到文件c
时,这是鸡和蛋的问题:
如果不预先创建c
,那就意味着shell需要将输出存储在缓冲区中,并且(最后)将该缓冲区写入文件。
由于在许多情况下这不是最好的方法(因为内存管理,在完成之前中断命令的失败管理等),文件会被预先创建。
因此,命令的标准输出可以替换为新创建的文件,命令输出可以流式传输到该文件。
答案 1 :(得分:3)
命令的标准输出重定向
ls > c
在执行命令c
之前为ls
创建文件句柄。 touch b
(b
的可见性是红鲱鱼)。例如,
mkdir t ; cd t ; ls > a ; cat a
将显示a
(因为 >
在a
exec
d之前创建ls
。
答案 2 :(得分:1)
创建(或截断)文件,以便ls
的输出可以重定向到它。
因此,ls
会看到该文件。
答案 3 :(得分:0)
了解ls
的输出被重定向到文件c,我们需要查看shell用来执行此命令的过程。
当shell处理命令行(非常简化)时:
由于需要在步骤3设置输出,任何将接收输出的文件必须存在,或者如果它不存在则被创建。
然后,在执行命令(在这种情况下为ls)时,必须已存在文件(在本例中为c)才能接收命令输出。
因此,正确看到文件内容中列出的两个文件。