我正在用 bash 编写一个 shell 脚本,在其中我在文件之间建立了一些链接,但我不确定要使用哪种链接(物理链接或符号链接)。做一些研究,我注意到使用符号链接而不是物理链接更常见。我的问题是为什么在需要间接引用时使用符号链接(它会创建一个额外的 I 节点来保护有关文件的真实 I 节点的信息)而不是使用直接指向文件的硬链接?
换句话说:
为什么
ln -s ...
代替
ln -P ...
我正在用 bash 编写一个 shell 脚本,在其中我在文件之间建立了一些链接,但我不确定要使用哪种链接(物理链接或符号链接)。做一些研究,我注意到使用符号链接而不是物理链接更常见。我的问题是为什么在需要间接引用时使用符号链接(它会创建一个额外的 I 节点来保护有关文件的真实 I 节点的信息)而不是使用直接指向文件的硬链接?
换句话说:
为什么
ln -s ...
代替
ln -P ...
符号链接的主要原因是“软”符号链接可以跨越文件系统边界。表示符号链接的文件将包含一个字符串,该字符串是所指向文件的实际路径。只要该路径的最终用户表示保持不变,符号链接就可以工作。如果您在符号链接的末尾移动文件,符号链接现在将是陈旧的(也称为“悬空”),因为它指向的资源不再存在。
硬(又名物理)符号链接在 inode 层工作。由于 inode 仅在单个文件系统中是唯一的,因此您不能硬链接 ACROSS 文件系统。如果允许,您很容易遇到重复 inode 的情况。好处是,无论您将硬链接的目标移动到哪里,指向资源的链接都会“跟随”,因为它们指向 inode 本身,而不关心实际的路径/资源名称是什么。
在我的头顶上:
符号链接跨文件系统工作。如果您不想跟踪源文件和目标链接所在的文件系统,或者如果您有时跨文件系统移动文件,那么使用符号链接就不那么麻烦了。
$ @ $&emacs
备份文件。当您在 emacs 中编辑、说file.txt
并对其进行更改时,emacs 会将原始文件重命名为file.txt~
并将您的更改保存在原始文件名下。如果有硬链接到file.txt
,它现在链接到file.txt~
,这可能不是您想要的。指向的符号链接file.txt
仍将指向更新的 inode。
硬链接只能在同一个文件系统上工作,重命名 inode。只有当指向其 inode 的最后一个链接消失时,才能删除文件。硬链接通常用于文件而不是目录。
符号链接是包含指向另一个文件的路径的实际文件。符号链接也可以跨文件系统工作。它们也可以指向不同的文件类型。符号链接也可以指向文件或目录。
硬链接在文件系统中没有意义,因为它们基本上是指向本地 FS 上的 inode 的指针。符号链接不在乎;因为他们只是名字,他们可以住在任何地方。
如果您查看目录列表并看到一个符号链接,您就知道它指向特定的其他位置。另一方面,硬链接没有提供这样的线索。你可能不知道你在玩一些重要的文件,直到你知道stat
它的名字。