有趣的bash行为

时间:2015-10-18 20:36:10

标签: bash shell sh

为什么这个命令(创建一个空文件夹,更改为它,触摸文件,调用ls然后cat),显示两个文件?

root@ubuntu:~# mkdir a ; cd a ; touch b ; ls > c ; cat c
b
c

我相信我应该只得到“b”。

4 个答案:

答案 0 :(得分:5)

当您将ls的输出重定向到文件c时,这是鸡和蛋的问题:

如果不预先创建c,那就意味着shell需要将输出存储在缓冲区中,并且(最后)将该缓冲区写入文件。

由于在许多情况下这不是最好的方法(因为内存管理,在完成之前中断命令的失败管理等),文件会被预先创建。

因此,命令的标准输出可以替换为新创建的文件,命令输出可以流式传输到该文件。

答案 1 :(得分:3)

命令的标准输出重定向

ls > c

在执行命令c之前为ls创建文件句柄。 touch bb的可见性是红鲱鱼)。例如,

mkdir t ; cd t ; ls > a ; cat a

将显示a因为 >a exec d之前创建ls

答案 2 :(得分:1)

创建(或截断)文件,以便ls的输出可以重定向到它。

因此,ls会看到该文件。

答案 3 :(得分:0)

了解ls的输出被重定向到文件c,我们需要查看shell用来执行此命令的过程。

当shell处理命令行(非常简化)时:

  1. 将线条划分为标记(通常在空格处)。
  2. 解释所有令牌(命令,参数,重定向)。
  3. 设置输入和输出的结构,包括任何重定向。
  4. 执行命令,将其输出发送到正确的位置。
  5. 由于需要在步骤3设置输出,任何将接收输出的文件必须存在,或者如果它不存在则被创建。

    然后,在执行命令(在这种情况下为ls)时,必须已存在文件(在本例中为c)才能接收命令输出。

    因此,正确看到文件内容中列出的两个文件。