私はシンボリックリンクとハードリンクの間の技術的な違いを理解し、実際に使用する問題であり、特に見た目に似た条件であるディレクトリで両方が使用されている理由がわかります/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
より見やすくするために、同じインデックスノードへのハードリンクをインデントします。したがってbzcmp
、 の場合はシンボリックリンクを使用し、bzegrep
の場合はハードリンクを使用します。bzfgrep
bzless
bzip2
bzcat
bunzip2
どちらも、通常のファイル(ディレクトリではない)、ファイルシステムに常駐し、システムユーティリティであり、同じ作業であるbzipアーカイブを処理するようにも設計されています。この特別なケースでハード/シンボルリンクを使用する理由は純粋に歴史的なものですか、それとも何か抜けましたか?
私の質問を明確にするには:
はいいいえ尋ねる:
- シンボリックリンクとハードリンクの技術的違い
- 理論的には、それぞれの長所と短所
これらの問題はSOの他のスレッドで解決されました。私は特定の状況、つまり関連するシステムユーティリティのセットでなぜ他の決定がなされるのかを理解しようとしています。技術的には両方ともシンボリックリンクであっても、どちらもハードリンクであってもよい。どちらのオプションも機能します(そしてどちらの場合も、プログラムは呼び出しをどのように通過したかを把握できますargv[0]
)。ここの意図(ある場合)を理解したいと思います。
関連:
答え1
ハードリンクとシンボリックリンクを使用する理由
この場合、シンボリックリンクよりもハードリンクを使用すると、3つの主な利点があります。
ハードリンク
- ハードリンクの場合、リンクはinodeを直接指します。
- ハードリンクには実行可能ファイルの複数のコピーがありますが、そのうちの1つのディスク領域のみを使用するのと同じです。
- 何も壊さずにハードリンクのすべての分岐の名前を変更することができます。
シンボリックリンク
- リンクはオブジェクトを指します(このオブジェクトはinodeを指します)。
- ファイルシステムにまたがる可能性がありますが、ハードリンクはできません。
一般リンクの利点
これらのリンクは、多くの実行ファイルが呼び出し方法によって異なる動作をするために存在します。たとえば、これら2つのコマンドはbzless
実際にはbzmore
1つの実行可能ファイルです。bzmore
実行可能ファイルは、呼び出される名前によって異なる動作をします。
これにはいくつかの理由があります。以下はもっと明確なものです:
- 単一の実行可能ファイルを開発する方が、複数の実行可能ファイルを開発するよりも簡単です。
- ディスクスペースを節約
- より簡単な展開
なぜ両方とも使用されますか?
この特定のアプリケーションでは、どちらかを選択することは意味がありません。どちらも、単一の実行可能ファイルを再ロードできるようにエイリアスとして機能する機能を容易にします。これは実際にさまざまなプログラム開発者が活用している重要な機能です。
報告FHS(ファイルシステム階層標準)このように指定しても、どちらかを指定できます。
抜粋
/ bin / shが実際のBourneシェルではない場合は、実際のシェルコマンドへのハードリンクまたはシンボリックリンクである必要があります。
その理由は、shとbashが必ずしも同じように動作しない可能性があるためです。また、シンボリックリンクを使用すると、ユーザーは/ bin / shが実際のBourneシェルではないことを簡単に知ることができます。
...
...
gunzipとzcatプログラムが存在する場合は、gzipへのシンボリックリンクまたはハードリンクである必要があります。 /bin/csh は、/bin/tcsh または /usr/bin/tcsh へのシンボリックリンクです。
引用する
答え2
どのような種類のリンクを使用するべきかを知らせる非技術的な規則があるかどうか、既存の慣行を通して把握しようとしているようです。 (私は言った非技術的どちらかを使用する必要がある技術的な理由を既に知っているからです。 )
答えは、他のルールがないということです。あなたがUbuntuパッケージで指摘した例は、bzip2
多くの開発者が特に考えずにUbuntuパッケージを混在させることを示しています。技術的な違いに加えて、強力なガイダンスはなく、これらの違いはわずかです。
個人的には、独自の文書化特性に代わって少しのオーバーヘッドを喜んで支払う意思があるので、シンボリックリンクを使用することを好みました。
他の開発者は最小限の効率を提供するので、ハードリンクを選択します。
この質問は次のようによく似ています。スペースとタブまたは動的タイピングと静的タイピングまたはEmacsとviしかし、トリガーするほど興味深いものではありません。神殿。より興味深い戦いと同様に、2つのオプションのうちの1つを選択する理由がありますが、誰かがどのオプションを使用するべきかを教えていない限り、自分に適したオプションを選択する必要があります。