我已经阅读了这个链接,现在我只是想知道为什么里面有很多硬链接/usr
。
例如,在我的 Ubuntu 服务器中,安装了git
,我在这里找到了命令git
:/usr/bin/git
. 我执行ls -l /usr/bin/git
并得到如下输出:
-rwxr-xr-x 119 root root 11178080 Mar 6 03:48 /usr/bin/git
如您所见,有 119 个硬链接...
为什么这里需要119个硬链接?通俗点说,我们有了环境变量PATH
,并且已经放入了可执行文件/usr/bin/
,另外,出于兼容性的原因,我们可以创建软链接,我们可以随时随地执行,为什么会有一些硬链接usr
呢?
的部分输出find /usr -samefile /usr/bin/git
:
/usr/libexec/git-core/git-prune
/usr/libexec/git-core/git-diff-index
/usr/libexec/git-core/git-ls-remote
/usr/libexec/git-core/git-merge-recursive
/usr/libexec/git-core/git-push
/usr/libexec/git-core/git-update-index
/usr/libexec/git-core/git-check-mailmap
/usr/libexec/git-core/git-interpret-trailers
/usr/libexec/git-core/git-archive
/usr/libexec/git-core/git-upload-archive
/usr/libexec/git-core/git-rev-parse
/usr/libexec/git-core/git-ls-files
/usr/libexec/git-core/git-am
的所有硬链接/usr/bin/git
都在/usr/libexec/git-core/
.
这些
git
链接与 PATH 无关,它们是一种节省空间的措施。一般来说,在大多数情况下,对于“已安装”的软件,硬链接在可能的情况下比符号链接更可取,因为它们更有效且更有弹性。您会看到很多
/usr/bin
带有硬链接的二进制文件,包括perl
,这很好。git
软件包确实倾向于使用符号链接,因为涉及大量链接以及可能导致. 如果您git
从源代码安装,它会尽可能默认使用硬链接;您可以通过添加NO_INSTALL_HARDLINKS=1
到make install
命令的参数来禁用它。通常,具有多个相关函数的单个二进制文件具有多个硬链接,以便让每个函数都有一个独特的、令人难忘的命令,并且仍然不重复所有这些函数可能具有的任何共同代码。
使单个二进制文件的各种函数显示为不同的命令也是使函数 TAB 可完成的一种简单的、独立于 shell 的方法:例如,在 中
bash
,如果您只记得某些命令的前几个字母,只需键入字母您记得并按两次 TAB:您将获得所有带有这些首字母的命令的列表。符号链接也可以用于此,但如果所有链接的命令都在同一个目录中,硬链接是最节省空间的解决方案:而不是复制整个文件,或者只使用一个额外的 inode,如符号链接可能会(在某些文件系统上),硬链接只占用一个目录条目。
如果你愿意,你也可以轻松地让脚本表现得像这样: