我读了这个链接,现在我只想知道为什么里面有很多硬链接/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/
。
答案1
这些git
链接与路径无关,它们是一种节省空间的措施。
一般来说,在大多数情况下,对于“已安装”的软件,如果可能的话,硬链接比符号链接更可取,因为它们更高效、更有弹性。您会看到很多/usr/bin
带有硬链接的二进制文件,包括perl
,这很好。
git
包确实倾向于使用符号链接,因为涉及大量链接并且可能导致的问题。如果您git
从源代码安装,如果可能的话,它将默认使用硬链接;您可以通过添加NO_INSTALL_HARDLINKS=1
到make install
命令的参数来禁用它。
答案2
通常,具有多个相关函数的单个二进制文件具有多个硬链接,以便让每个函数都有一个独特的、易于记忆的命令,并且仍然不会重复所有这些函数可能共有的任何代码。
使单个二进制文件的各种函数显示为不同的命令也是一种简单的、独立于 shell 的方法,可以使函数可完成 TAB:例如,在 中bash
,如果您只记得某个命令的前几个字母,只需键入这些字母您记住并按 TAB 两次:您将获得包含这些首字母的所有命令的列表。
符号链接也可以用于此目的,但如果所有链接的命令都预计位于同一目录中,则硬链接是最节省空间的解决方案:而不是复制整个文件,或者仅使用额外的索引节点(如符号链接可能会这样做(在某些文件系统上),硬链接仅占用一个目录条目。
如果您愿意,您也可以轻松地使脚本表现得像这样:
#!/bin/sh
case "${0##*/}" in
name1)
# do something
;;
name2)
# do something else
;;
*)
# output an error message, or perhaps usage instructions
;;
esac