-f选项对`touch`的用途是什么?


23

来自man touch

-f     (ignored)

但我不明白被忽略的含义。

我试过以下:

$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file

$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file

并注意到它尽管更改了时间戳 -f

因此,我想知道-f代表什么或代表什么。


2
我认为-fas选项只是被忽略。也许通过参数解析器进行了修改,仅此而已。
托马斯

1
(忽略)表示该标志被忽略,而不是命令。
基金莫妮卡的诉讼

Answers:


47

对于GNU实用程序,完整的文档在该info页面中,您可以在其中阅读:

-f
忽略 与“触摸”的BSD版本兼容。

请参阅具有历史意义的BSD手册页以进行触摸,在哪里-f可以强制进行触摸。

如果您查看那些旧BSD的来源,则没有utimes()系统调用,因此touch将以读写模式打开文件,读取一个字节,向后查找并再次写入,以更新上次访问和上次修改时间

显然,你需要两个读取写入权限(touch将避免尝试这样做,如果access(W_OK|R_OK)返回false)。-f尝试通过暂时将权限临时更改为0666来解决此问题

0666表示对所有人的读写许可。必须这样,否则(例如,在0600等更严格的许可下仍会允许触摸)可能意味着在该短窗口期间,原本具有对该文件的读或写权限的进程将无法再使用,破坏功能

但是,这意味着原本无法访问该文件的进程现在很少有机会打开它,从而破坏了安全性

那不是一件很明智的事情。现代touch实现不这样做。从那时起,引入了utime()系统调用,从而允许分别更改修改和访问时间,而不必与文件内容打交道(这意味着它也可以与非常规文件一起使用),并且只需要对此进行写访问。

touch如果通过了该-f选项,GNU 仍然不会失败,而只是忽略该标志。这样,为那些旧版本的BSD编写的脚本在移植到GNU系统时不会失败。如今相关性不高。


3
根据developer.apple.com/library/mac/documentation/Darwin/Reference/… -f在Mac OS X中仍然可以使用。(但毫无疑问,至少有57种使用GUI“更好”执行相同功能的不同方式! )
alephzero

20
使用GUI并不一定“更好”。使用脚本的目的是使内容自动化,其中包括确保脚本在尽可能多的unixy方言上或至少在您可能会遇到的大多数方言上未修改地运行,而这正是这些陈旧的,已过时的兼容性问题所在。
Guntram Blohm

@alephzero这是因为OS X中的版本是BSD版本,GNU正在与之兼容。
Barmar

14

-f什么也没做。保留它是为了实现历史兼容性(touch根据的BSD info touch),以便期望它存在的应用程序不会通过它,并返回一条错误消息,指出它不存在。假设这是GNU coreutils,您可以在源代码中看到它只是执行了break选项处理开关,而不执行任何操作。

作为一个被忽略的选项,-f它出现touch在1992年添加的GNU 命令的第一个版本中(请参阅diff)。看来,至少在FreeBSD v9中,-f“即使文件权限当前不允许,也要尝试强制更新”(由Sukminder找到,谢谢)。


2
info页面说“ 忽略”;与“触摸”的BSD版本兼容。
heemayl

@heemayl除了我找不到一个似乎带有“ -f”自变量的BSD之外,因此它必须很旧。
克里斯·

嗯。我刚刚检查了Coreutils manual,上面写着:“忽略;与BSD版本的touch兼容。”
Pandya

3
-f即使文件权限确实允许在BSD上进行更新,它还是曾经被用来试图强制进行更新。不是在V10中,而是在v9中:freebsd.org/cgi/…(至少是FreeBSD的)。
Runium

@sukminder Ace,谢谢!我会将您的信息添加到答案中。
克里斯·唐纳

12

每当在--help输出或联机帮助页中看到“选项X被忽略”时,这都意味着:程序接受选项X-您不会收到语法错误-但它没有任何作用。该程序执行的操作与没有该选项时执行的操作相同。

如其他答案所示,这样做是为了向后兼容。一个选项用于有一定的效果,不管它确实不再有用,也不管选择的做同样的事情是正确的兼容性行为。


0

查看历史性源代码第22行中的注释时:

  22   -f                     (ignored)\n\

自Jim Meyering最初发布以来,-f选项已被忽略。

而处理选项的switch语句有一个明确的情况(第150/151行),什么也不做:

 150         case 'f':
 151           break;

自1992年以来,促使以下作者放弃此选择的原因很了不起。也许有一个使用场景需要-f选项,否则会中断?

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.