为什么 /bin 中混合了符号链接和硬链接?

Dmi*_*ich 10 hard-link utilities symlink

我了解符号链接和硬链接之间的技术差异,这是一个关于它们在实践中使用的问题,特别是我很想知道为什么两者都在看似相似的条件下使用:/bin目录。

这是它在我的系统上的列表的片段:

~$ ls -lai /bin
total 10508
32770 drwxr-xr-x  2 root root    4096 Jun 14 11:47 .
    2 drwxr-xr-x 28 root root    4096 Sep  6 13:15 ..
  119 -rwxr-xr-x  1 root root  959120 Mar 28 22:02 bash
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bunzip2
  127 -rwxr-xr-x  1 root root 1832016 Nov 16  2012 busybox
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bzcat
 6191 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzcmp -> bzdiff
 5640 -rwxr-xr-x  1 root root    2140 Dec 15  2011 bzdiff
 5872 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzegrep -> bzgrep
 3520 -rwxr-xr-x  1 root root    4877 Dec 15  2011 bzexe
 6184 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzfgrep -> bzgrep
 5397 -rwxr-xr-x  1 root root    3642 Dec 15  2011 bzgrep
   2820 -rwxr-xr-x  3 root root   31112 Dec 15  2011 bzip2
 2851 -rwxr-xr-x  1 root root   10336 Dec 15  2011 bzip2recover
 6189 lrwxrwxrwx  1 root root       6 Dec 15  2011 bzless -> bzmore
 5606 -rwxr-xr-x  1 root root    1297 Dec 15  2011 bzmore
Run Code Online (Sandbox Code Playgroud)

我将硬链接缩进到同一个 inode 以获得更好的可见性。所以在的情况下使用符号连接bzcmpbzegrepbzfgrepbzless和在硬连接的情况下bzip2bzcatbunzip2

它们都是常规文件(不是目录),驻留在一个文件系统中,是系统实用程序,甚至用于处理相同的事情:bzip 档案。在这种特殊情况下使用硬链接/符号链接的原因是纯粹的历史还是我遗漏了什么?

澄清我的问题:

不是问:

  • 符号链接和硬链接之间的技术差异
  • 它们各自的理论优缺点

这些问题已在 SO 的其他主题中解决。我试图理解为什么在特定情况下会做出不同的决定:针对一组相关的系统实用程序。从技术上讲,它们都可以是符号链接,也可以是硬链接,这两种选项都可以使用(在这两种情况下,程序仍然可以弄清楚它是如何通过 调用的argv[0])。如果有的话,我想了解这里的意图。

有关的:

slm*_*slm 5

为什么使用硬链接与符号链接

在这种情况下,与符号链接相比,使用硬链接主要有 3 个优点。

硬链接

  1. 使用硬链接,链接直接指向inode。
  2. 硬链接就像拥有多个可执行文件副本,但只使用其中一个的磁盘空间。
  3. 您可以在不破坏任何内容的情况下重命名硬链接的任一分支。

符号链接

  1. 链接指向对象(然后又指向 inode)。
  2. 它们可以跨越文件系统,而硬链接则不能。

一般链接的优点

之所以存在这些链接,是因为许多可执行文件的行为因它们的调用方式而异。例如,2级的命令bzlessbzmore实际上是一个可执行文件,bzmore。根据用于调用它的名称,可执行文件的行为会有所不同。

这样做有多种原因。以下是一些比较明显的:

  1. 开发单个可执行文件比开发多个可执行文件更容易
  2. 节省磁盘空间
  3. 更容易部署

为什么两者都被使用?

在这个特定的应用程序中,选择哪一个是没有实际意义的。两者都可以促进充当别名的功能,以便可以重载单个可执行文件。这确实是这里各种程序的开发人员正在利用的关键功能。

在查看FHS(文件系统层次结构标准)时甚至以这种方式指定它,它可以是。

摘抄

如果 /bin/sh 不是真正的 Bourne shell,则它必须是指向真实 shell 命令的硬链接或符号链接。

这背后的基本原理是因为 sh 和 bash 可能不一定以相同的方式运行。使用符号链接还可以让用户轻松看出 /bin/sh 不是真正的 Bourne shell。

...

...

如果 gunzip 和 zcat 程序存在,它们必须是 gzip 的符号或硬链接。/bin/csh 可能是 /bin/tcsh 或 /usr/bin/tcsh 的符号链接。

参考


War*_*ung 5

似乎您正试图从现有实践中找出是否有非技术规则告诉您要使用哪种链接。(我说非技术性是因为您已经知道使用一种而不是另一种的技术原因。)

答案是,没有其他规则。你从 Ubuntu 的bzip2包中指出的这个例子只是表明许多开发人员在没有充分考虑的情况下混合使用它们。这是因为除了技术差异之外没有强有力的指导,而且这些差异很小。

就我个人而言,我总是更喜欢使用符号链接,因为我愿意为它们的微不足道付出代价,以换取它们的自我记录性质。

其他开发人员将选择硬链接,因为他们提供的效率极低。

这个问题很像空格与制表符动态与静态类型Emacs 与 vi,只是它不够有趣,不足以引发一场圣战。就像更有趣的战斗一样,选择任何一个选项都是有理由的,但除非有人告诉您使用哪个选项,否则您可以选择对您更有意义的选项。