`touch` 的 -f 选项有什么用?

Pan*_*dya 24 coreutils touch

来自man touch

-f     (ignored)
Run Code Online (Sandbox Code Playgroud)

但我不明白什么叫忽略

我试过以下:

$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:17 file
Run Code Online (Sandbox Code Playgroud)

$ touch -f file
$ ls -l file
-rw-rw-r-- 1 pandya pandya 0 Mar 20 16:18 file
Run Code Online (Sandbox Code Playgroud)

并注意到尽管 -f.

所以,我想知道-f它代表什么,或者它有什么作用。

Sté*_*las 48

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

-f
忽略;与 BSD 版本的“touch”兼容。

触摸历史BSD手册页,其中-f强制的触感。

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

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

0666 表示对所有人的读写权限。必须是,否则(例如具有更严格的权限,例如 0600 仍然允许触摸),这可能意味着在那个短窗口期间,本来对文件具有读或写权限的进程不能再有,破功能

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

这不是一件非常明智的事情。现代touch实现不会那样做。从那时起,utime()系统调用被引入,允许单独更改修改和访问时间,而不必与文件内容混合(这意味着它也适用于非常规文件),并且只需要写访问权限。

touch如果传递-f选项,GNU仍然不会失败,但只是忽略该标志。这样,为那些旧版本的 BSD 编写的脚本在移植到 GNU 系统时不会失败。现在没有太多相关性。

  • 使用 GUI 不一定“更好”。使用脚本的重点是自动化,包括确保您的脚本在尽可能多的 unixy 方言上运行,或者至少在您可能遇到的大多数方言上未经修改,这就是这些旧的、已弃用的兼容性问题成为一个问题的地方. (20认同)
  • 根据 https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/touch.1.html `-​​f` 在 Mac OS X 中仍然有效。(但毫无疑问至少有使用 GUI 有 57 种不同的方式可以“更好地”执行相同的功能!) (3认同)

Chr*_*own 14

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

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

  • `-f` 用于尝试强制更新,即使文件权限允许它在 BSD 上也是如此。不是 V10,而是 V9:https://www.freebsd.org/cgi/man.cgi?query=touch&sektion=1&manpath=FreeBSD+9.3-RELEASE(至少是 FreeBSD)。 (3认同)
  • `info` 页面显示 _Ignored;与 BSD 版本的“touch”兼容。_ (2认同)

zwo*_*wol 12

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

正如其他答案所示,这样做是为了向后兼容。曾经有一些效果的选项,无论它做什么都不再有用,而不管选项如何都做同样的事情是正确的兼容性行为。