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

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

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代表什么,或者它有什么作用。

答案1

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

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

历史悠久的 BSD 触摸手册页,-f要去哪里力量触摸。

如果你查看那些旧 BSD 的源代码,就会发现没有utimes()系统调用,所以touch将以读+写模式打开文件,读取一个字节,回溯并再次写入,以更新最后访问和最后修改时间

显然,你两者都需要权限(touchaccess(W_OK|R_OK)如果返回 false将避免尝试这样做)。-f试图解决这个问题暂时将权限暂时更改为0666

0666 表示所有人都有读写权限。必须如此,否则(就像使用更严格的许可,例如 0600,仍然允许触碰)这可能意味着在这个短暂的窗口期间,本来具有文件读取或写入权限的进程将无法再访问,从而破坏功能性

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

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

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

答案2

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

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

答案3

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

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

答案4

在看评论里的时候历史源代码,第 22 行:

  22   -f                     (ignored)\n\

自 Jim Meyering 首次发布以来,-f 选项就打算被忽略。

处理选项的 switch 语句有一个明确的情况(第 150/151 行)不执行任何操作:

 150         case 'f':
 151           break;

值得注意的是,自 1992 年以来,是什么促使以下作者一直忽略这个选项。也许有一个使用场景需要选项 -f 否则会中断?

相关内容