PATHを更新するのではなく、optで実行可能ファイルにシンボリックリンクが優先される解決策であるのはなぜですか? [閉鎖]

PATHを更新するのではなく、optで実行可能ファイルにシンボリックリンクが優先される解決策であるのはなぜですか? [閉鎖]

これに回答すべての/opt/tool/binサブディレクトリをPATHに追加する方法を提供します。

for d in /opt/*/bin; do PATH="$PATH:$d"; done

しかし、ギルスはこう言いました。

しかし、これはほとんど行われません。非標準ディレクトリの実行可能ファイルが$ PATHにある場合、一般的なアプローチはパスのディレクトリ(/usr/local/binなど)にシンボリックリンクを作成することです。これお店これに関連して、ユーティリティ(またはxstow)が役に立ちます。

最後のものその他答えはこの主張を支持します。

/opt/*/binただし、実行可能ファイルへのシンボリックリンクが望ましい理由はわかりません。これにより、不要な追加メンテナンスが追加されるようです。

PATHを更新するのではなく、optで実行可能ファイルにシンボリックリンクが優先される解決策であるのはなぜですか?

答え1

質問に答えようとしていますが、どのソリューションが「最適」なのかを説明するのではなく、Gilesがシンボリックリンクを使用してツールセットを提供し、メンテナンスの側面を解決するように提案する理由を説明するためです。結局のところ、システムに適したソリューションが何であるかを判断するのは、ローカル管理者の役割です。

bin新しいツールを追加するには、ユーザーのディレクトリを追加してすべてのPATHユーザーの変数を更新する必要がありますPATH(この変数は、新しいシェルセッションが開始されるまで適用されません)。

GNUを使用すると、Gillesが提案したように、たとえばツールごとに1つのディレクトリ、各ツールには独自のサブディレクトリなどのディレクトリstow構造があります。各ツールは通常、インストールプレフィックスを指定してインストールされます。/opt/stowbinlib/opt/stow/toolname

/optサブディレクトリはそのディレクトリとシンボリックリンクされているため、stowメンテナンスコストが最小限に抑えられます。追加する必要がある唯一のディレクトリはPATH/opt/bin/opt/sbin

一般的には

/opt/stow/tool-A-1.23
/opt/stow/tool-A-1.25
/opt/stow/tool-B-3.0

それから:

cd /opt/stow
stow tool-A-1.23
stow tool-B-3.0

これにより、/opt適切なシンボリックリンクで階層がいっぱいになり、アクセスできます/opt/bin。これは、ツール実行可能ファイル間の名前の競合がないと仮定しますが、これらのすべてのパスをPATH

1.23から1.25に切り替えるにはtool-A

cd /opt/stow
stow -D tool-A-1.23
stow tool-A-1.25

手動でシンボリックリンクを維持したり、ユーザーの変更を行う必要はなく、PATH変更はすべてのユーザーにすぐに適用されます。

答え2

すべてを置く/opt/*/binことの欠点PATHは、新しいアプリケーションがインストールされるか、別のアプリケーションが更新されるたびに(パスが変更される)リストを変更する必要があることです。

ユーザーは再度ログインするか、手動でパスを更新する必要があります。単純なログイン - 何か - ログアウトのユースケースではこれは問題ではないかもしれませんが、screenorbを実行している人のように長期実行セッションの場合はtmux問題になります。 (以前のバージョンで実行されているシェル(またはEmacs)がある可能性があり、ターミナルPATHマルチプレクサ自体も以前のバージョンを使用しますPATH。これはユーティリティを直接実行する場合に重要です。)

これにより、ユーザーが表示したくない視覚的に不快なディレクトリのリストが生成される可能性があります。PATHに設置することに気を付ける必要がない場合/opt

またPATH、で明示的に設定する必要がある場合は、実際のディレクトリリストを作成して更新するのではなく、このような内容を作成する方がcrontab簡単です。 NETではループとグローブは使用できません。/bin:/usr/bin/:/opt/bin/optcrontab

管理費の場合、コサロナンダ議論stowln -s ../someutil-1.2.3/bin/* .ただし、これがない場合でも、内部で実行して必要なシンボリックリンクを作成できます/opt/bin。 (以前のものを削除するわけではありませんそれマイナーですが、ユーティリティディレクトリを削除するときに壊れたリンクを残すことは、シェルの動作に影響を与えず、わずかにきれいではありません。 )

答え3

解決すべき主な問題は、プログラム名の競合です。

PATH1977年以来、Bourne Shellにバイナリパス位置のハッシュが存在したため、大きな値を持つことはもはや問題になりません。

次の1つの理由を除いて、シンボリックリンクは一般的ではありません。

クラスタービューとは異なる独自のプログラム選択機能があります。

たとえば、PATHを次のように設定した場合:

PATH=/usr/gnu/bin:/usr/bin

標準システムツールの前にすべてのGNUツールを見つけることができます。

chmodこれにより、GNUツールを簡単に使用できますが、たとえば、ACLをサポートせずにtar移植性の問題を持つアーカイブを生成することが知られているGNUを使用するGNUを使用する必要がある結果も発生します。

xgettextあなたは基本的にGNUに興味がありますが、GNUツールには知られていない拡張システム機能のサポートを含む公式のシステムツールを使用することを好むとしましょう。たとえば、次のように独自のbinディレクトリを作成します。

mkdir ~/bin

その後、シンボリックリンクを作成する場合:

cd ~/bin
ln -s /usr/gnu/bin/xgettext

次のパスを設定します。

PATH=~/bin:/usr/bin:/usr/gnu/bin

xgettextを呼び出すとGNU xgettextが得られますが、たとえば呼び出すか、xgettext公式のシステムツールを取得します。 GNUツールへのシンボリックリンクがあることがよくありますが、デフォルトのプレフィックス(例:to)があるため、tarを呼び出して意図的にGNU tarを使用できます。chmodtar/usr/bin//usr/bin/gtar/usr/gnu/bin/targtar

注:/opt/binUNIX FHS規格の一部ではありません。

/opt/<vendor>/bin

まさか

/opt/<project>/bin

しかし、後者の例もあります。

関連情報