我知道该touch
命令用于更新文件的上次修改日期。如果文件系统上不存在请求的文件,它还用于创建新文件。
既然 touch (正如它的名字所暗示的那样),应该只更新最后的修改日期,为什么它还尝试创建一个新文件?
它只是在触摸代码中写入的检查,还是其他导致创建文件的原因?
答案1
touch
如果文件不存在,则创建一个新的空文件,因为这就是它的设计目的。该实用程序必须包含专门处理该情况的代码。该实用程序出现在Unix V7;它是手动的如此描述:
touch — 文件上次修改的更新日期
touch
尝试设置每个的修改日期文件。这是通过从文件中读取一个字符并将其写回来完成的。如果**文件*不存在,除非-c
指定该选项,否则将尝试创建它。
(我不知道touch
如果文件为空会发生什么。底层系统调用后来来了。)
我不确定为什么touch
要让该文件存在,但我怀疑这是因为make
。为什么要将文件的修改时间设置为当前时间?在某些情况下,将修改时间设置为特定时间可能很有用,但这种能力是后来才出现的,原始版本touch
只能将修改时间设置为当前时间。这样做的原因是重新运行make
依赖于该文件的规则。
也就是说,假设您有一个文件foo
和一个声明从 生成命令的bar
makefile foo
。当您键入 时,将执行并创建make bar
命令。bar
如果bar
存在并且比 更新foo
,make bar
则不执行任何操作,因为make
假设bar
已经生成。但是,如果bar
早于foo
,则 make 认为它bar
不是最新的,需要重新生成。
但是如果生成的规则bar
发生了变化怎么办?那么你有两个选择:
rm bar; make bar
touch foo; make bar
您需要foo
存在才能生成bar
,否则该命令通常无法工作。
“触摸”这个术语也出现在make
utility: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
的代码中,我不会称其为查看尽管。通过打开文件进行写入然后关闭它来更新时间戳。