为什么触摸创建新文件?


13

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

由于touch(顾名思义),应该只更新上次修改日期,为什么还要尝试创建一个新文件?

仅仅是用触控代码编写的支票,还是导致文件创建的其他方式?


作为一个用例,我使用touch /forcefsck一个空文件创建该文件,/forcefsck以强制在下次重新启动时检查文件系统是否存在错误。文件本身不需要包含任何内容,只需要存在即可。没有touch,我需要使用vinano保存空白文件。使用起来更快touch
蒂姆(Tim)

@Tim没有真正的原因,您不能使用>/forcefsckprintf '' >>/forcefsck(后者将保留任何现有内容)。您所描述的是一种使用以某种方式工作的实用程序的方法,但与编写这种方式工作的原因无关。
CVn

如果这个问题是关于设计的,touch而不是它的工作方式,那么我认为它touch在文件创建方面违反了单一责任原则。因此,“为什么”仅是由于早期的设计选择因流行和普及/易用性而卡住了。
乔治·潘塔兹

Answers:


15

使用strace touch t收益:

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

它是在touch的代码中,不过我不会称之为支票。通过打开文件进行写入然后关闭文件来更新时间戳。


14

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

touch —文件的最后修改日期

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

(我不知道touch如果文件为空该怎么办。基础系统调用稍后出现。)

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

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

但是,如果生成的规则bar已更改怎么办?然后,您有两个选择:

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

您可能需要foo存在才能生成bar,否则该命令通常将不起作用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.