从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
将以读+写模式打开文件,读取一个字节,回溯并再次写入,以更新最后访问和最后修改时间。
显然,你两者都需要读和写权限(touch
access(W_OK|R_OK)
如果返回 false将避免尝试这样做)。-f
试图解决这个问题暂时将权限暂时更改为0666!
0666 表示所有人都有读写权限。必须如此,否则(就像使用更严格的许可,例如 0600,仍然允许触碰)这可能意味着在这个短暂的窗口期间,本来具有文件读取或写入权限的进程将无法再访问,从而破坏功能性。
然而,这意味着原本无法访问该文件的进程现在有一个短暂的机会打开它,从而破坏安全。
这不是一件非常明智的事情。现代的touch
实现并没有这样做。从那时起,utime()
系统调用已经引入,允许单独更改修改和访问时间,而不必与文件内容混合(这意味着它也适用于非常规文件),并且只需要写入访问权限。
如果传递了该选项, GNUtouch
仍然不会失败-f
,只是忽略该标志。这样,为旧版本 BSD 编写的脚本移植到 GNU 系统时就不会失败。如今没有太多相关性。
答案2
答案3
每当您在 --help 输出或联机帮助页中看到“选项 X 被忽略”,这意味着:程序接受选项 X — 您不会收到语法错误 — 但它没有任何效果。该程序会执行与没有该选项时相同的操作。
正如其他答案所示,这样做是为了向后兼容。一个选项用过的为了产生一些效果,无论它做了什么都不再有用,并且无论选项如何都做同样的事情是正确的兼容性行为。
答案4
在看评论里的时候历史源代码,第 22 行:
22 -f (ignored)\n\
自 Jim Meyering 首次发布以来,-f 选项就打算被忽略。
处理选项的 switch 语句有一个明确的情况(第 150/151 行)不执行任何操作:
150 case 'f':
151 break;
值得注意的是,自 1992 年以来,是什么促使以下作者一直忽略这个选项。也许有一个使用场景需要选项 -f 否则会中断?