为什么 touch 会创建新文件?

为什么 touch 会创建新文件?

我知道该touch命令用于更新文件的上次修改日期。如果文件系统上不存在请求的文件,它还用于创建新文件。

既然 touch (正如它的名字所暗示的那样),应该只更新最后的修改日期,为什么它还尝试创建一个新文件?

它只是在触摸代码中写入的检查,还是其他导致创建文件的原因?

答案1

touch如果文件不存在,则创建一个新的空文件,因为这就是它的设计目的。该实用程序必须包含专门处理该情况的代码。该实用程序出现在Unix V7;它是手动的如此描述:

touch — 文件上次修改的更新日期

touch尝试设置每个的修改日期文件。这是通过从文件中读取一个字符并将其写回来完成的。如果**文件*不存在,除非-c指定该选项,否则将尝试创建它。

(我不知道touch如果文件为空会发生什么。底层系统调用后来来了。)

我不确定为什么touch要让该文件存在,但我怀疑这是因为make。为什么要将文件的修改时间设置为当前时间?在某些情况下,将修改时间设置为特定时间可能很有用,但这种能力是后来才出现的,原始版本touch只能将修改时间设置为当前时间。这样做的原因是重新运行make依赖于该文件的规则。

也就是说,假设您有一个文件foo和一个声明从 生成命令的barmakefile foo。当您键入 时,将执行并创建make bar命令。bar如果bar存在并且比 更新foomake bar则不执行任何操作,因为make假设bar已经生成。但是,如果bar早于foo,则 make 认为它bar不是最新的,需要重新生成。

但是如果生成的规则bar发生了变化怎么办?那么你有两个选择:

  • rm bar; make bar
  • touch foo; make bar

您需要foo存在才能生成bar,否则该命令通常无法工作。

“触摸”这个术语也出现在makeutility:make -t bar只会假装运行命令,也就是说,它会将 的修改时间设置bar为当前时间,而不实际运行要生成的命令bar(如果您认为 的更改不foo应该影响 ,则可以这样做bar)。因此,该touch实用程序是该功能的独立版本make -t

答案2

使用strace touch t收益率:

open("t", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

它在touch的代码中,我不会称其为查看尽管。通过打开文件进行写入然后关闭它来更新时间戳。

相关内容