有趣的bash行为

  • 本文关键字:行为 bash bash shell sh
  • 更新时间 :
  • 英文 :


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

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

我认为我应该只得到"b"

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

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

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

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

命令

的标准输出重定向
ls > c

ls命令执行之前为c创建文件句柄。touch b(以及b的可见性是转移注意力的东西)。例如,

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

将显示a (因为 >创建a之前lsexec d)。

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

因此,ls看到文件

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

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

  1. 将行划分为令牌(通常在空格处)。
  2. 解释所有令牌(命令、参数、重定向)。
  3. 设置输入和输出的结构,包括任何重定向。
  4. 执行命令,将其输出发送到正确的位置。

由于需要在步骤3中设置输出,因此任何将接收输出的文件必须存在,或者如果不存在则创建。

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

因此,在文件c.

的内容中看到列出的两个文件是正确的

最新更新