/ usrになぜそんなに多くのハードリンクがあるのですか? [閉じる]

/ usrになぜそんなに多くのハードリンクがあるのですか? [閉じる]

私は読んだこのリンクさて、その中にハードリンクがなぜそんなにたくさんあるのか知りたいです/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

関連情報