![/ usrになぜそんなに多くのハードリンクがあるのですか? [閉じる]](https://linux33.com/image/129003/%2F%20usr%E3%81%AB%E3%81%AA%E3%81%9C%E3%81%9D%E3%82%93%E3%81%AA%E3%81%AB%E5%A4%9A%E3%81%8F%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%8C%E3%81%82%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
私は読んだこのリンクさて、その中にハードリンクがなぜそんなにたくさんあるのか知りたいです/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
通常、複数の関連機能を持つ単一のバイナリには、各機能に固有で覚えやすいコマンドを提供し、すべての機能に共通する可能性のあるコードを複製しないようにするために、複数のハードリンクがあります。
単一のバイナリファイルのさまざまな機能を別のコマンドで表示することも、機能をTAB完了可能にする簡単でシェルに依存しない方法です。たとえば、bash
コマンドの最初の数文字を覚えている場合は、次の文字を入力するだけです。覚えていてTABをダブルクリックすると、この最初の文字を含むすべてのコマンドのリストが表示されます。
この目的のためにシンボリックリンクも使用できますが、リンクされたすべてのコマンドが同じディレクトリにあると予想される場合、ハードリンクは最もスペース効率の良いソリューションです。ファイル全体をコピーしたり、シンボルなどの追加のinodeを使用する代わりに、link(一部のファイルシステムでは)ハードリンクが1つのディレクトリエントリしか占有しないようにすることもできます。
必要に応じて、スクリプトが次のように動作するように簡単に作成することもできます。
#!/bin/sh
case "${0##*/}" in
name1)
# do something
;;
name2)
# do something else
;;
*)
# output an error message, or perhaps usage instructions
;;
esac