每当我用来mcedit
编辑在某处硬链接的文件并且想要保存该文件时,编辑器都会询问我是否要删除硬链接。这是 Linux 上的常见行为还是mcedit
“特殊”行为?为什么常规应用程序(不是 fsck 或其他管理工具)会关心硬链接?
答案1
当您想要修改文件时,您有两种选择,每种选择都有其优点和缺点。
- 您可以就地覆盖该文件。这不使用任何额外的空间,并保留硬链接、权限和现有文件内容之外的任何其他属性。这样做的主要缺点是,如果在写入文件时发生任何事情(应用程序崩溃或断电),您最终会得到部分写入的文件。
- 您可以将文件的新版本写入具有不同名称的新文件,然后将其移动到位。这会使用更多空间并破坏硬链接,如果您对某个文件有写权限,但对它包含的目录没有写权限,则根本无法执行此操作。另一方面,文件的旧版本会自动被新版本替换,因此在每个时间点,文件名都指向文件的有效、完整版本。
Mcedit 正在询问您选择哪种策略。但奇怪的是,对于具有单个目录条目的文件,mcedit 的默认策略是截断现有文件,从而使您的数据面临风险。只有当安全策略会破坏硬链接时,您才有机会使用它。您可以在“选项”菜单的“编辑保存模式”对话框中更改此设置:“快速保存”表示覆盖,“安全保存”表示保存到临时文件然后重命名。选择安全模式后,您无法选择不破坏符号链接。
(在 mc 4.8.3 上进行的观察。如果最新版本中仍然存在这种情况,请考虑将其报告为设计错误 - “安全模式”应该是默认值,并且您应该有一个选项,以便在该模式下不破坏硬链接案件。)
Vim 或 Emacs 等优秀的编辑器可以让您选择默认策略。
答案2
这是不寻常的;我怀疑它是由一个不断搬起石头砸自己脚的开发人员设计的。
如果您写入具有多个链接的文件(“常规”文件链接到其目录),那么您将更改可能存在于另一路径下的文件。对于符号链接,您也会遇到同样的问题,但链接到的文件不知道它有指向它的符号链接。
如果写入多重链接文件,它会更改通过其他文件路径看到的内容;这就是多个链接的全部意义。
答案3
这在保存之前创建备份文件时会产生严重的影响(我认为mcedit
也是如此)。根据硬链接的处理,该索引节点的其他路径可能指向错误的文件。看到这个。
如果这与备份文件无关,那么它可能只是一个警告,请将其读为:“以防万一您忘记了:您不仅要更改 /foo/bar,还要更改 /bar/baz。”