来自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 系统时不会失败。现在没有太多相关性。
Chr*_*own 14
-f
什么也没做。保留它是为了历史兼容性(与 BSDtouch
根据info touch
),因此期望它存在的应用程序不会通过它并返回一条错误消息,指出它不存在。假设这是 GNU coreutils,您可以在源代码中看到这只是做了一个break
选项处理开关而没有做任何事情。
作为一个被忽略的选项,-f
它出现touch
在 1992 年添加的 GNU命令的第一个版本(参见 diff)。似乎至少在 FreeBSD v9 中,-f
“即使文件权限当前不允许,也尝试强制更新”(Sukminder 发现,谢谢)。
zwo*_*wol 12
每当您在 --help 输出或联机帮助页中看到“选项 X 被忽略”时,这意味着:程序接受选项 X — 您不会收到语法错误 — 但它没有任何效果。该程序执行的操作与没有该选项时所做的操作相同。
正如其他答案所示,这样做是为了向后兼容。曾经有一些效果的选项,无论它做什么都不再有用,而不管选项如何都做同样的事情是正确的兼容性行为。