PATHの異なる場所に同じ名前のバイナリが複数ある場合、仕様によってどのバイナリが使用されますか?

PATHの異なる場所に同じ名前のバイナリが複数ある場合、仕様によってどのバイナリが使用されますか?

PATH環境変数の2つの異なるディレクトリには、同じ名前のバイナリが含まれていますが(しかし少し異なる動作をしている場合)、どちらを使用するかについての仕様/保証はありますか?

which <binary name>私のコンピュータ(macOS Monterey、Darwin 21.2.0)は、PATHの最初のディレクトリでバイナリが選択されていることを観察しました(その内容は左から右に読みます)。しかし、これはすべてのLinux / UNIXオペレーティングシステムの標準動作ですか?つまり、いくつかの強制標準(POSIXなど)がありますか?

追加内容(気になる方のため):私はプロジェクト固有のフォルダにある標準バイナリのカスタムバージョンをダウンロードし、通常のバイナリの代わりにカスタムバイナリを使用する必要がある他のスクリプトを呼び出すスクリプトを含むプロジェクトを作成しています。 2番目のスクリプトを呼び出す前に、カスタムバイナリを含むフォルダをPATHに追加します。競合が発生したときにPATHを検索する方法を観察したところ、PATHのPATH=<my-custom-folder>:$PATH代わりにPATHを設定しましたPATH=$PATH:<my-custom-folder>。しかし、このプロジェクトには複数の共同作業者がいて、すべて同じバイナリを実行していることを確認したいと思います。他のオペレーティングシステムが私とは異なる方法でPATHを検索すると問題が発生します。

ベストアンサー1

POSIX 定義ライブラリの呼び出しexeclp(3)そしてexecvp(3)PATH指定された実行可能ファイルの場所の環境変数を取得します。 (実行ファイルが/bin/lsまたはなどの名前への相対パスまたは絶対パスを指定しない限り./a.out

これPOSIXの定義PATHそんなのか、

この変数は、ファイル名でのみ知られている実行可能ファイルを検索するときに特定の機能とユーティリティーが適用する一連のパスプレフィックスを表す必要があります。接頭辞は ( ':' ) で区切る必要があります。 [… ]リストは最初から最後まで検索する必要があります。、指定された名前と適切な実行権限を持つ実行可能ファイルが見つかるまで、各プレフィックスにファイル名を適用します。

POSIXシェルも従わなければならない(パート1e)このアプローチは、検索を関数$PATHの1つに直接延期しなくても同じです。exec(3)

したがって、あなたの質問に直接答えるために、未定義のコマンド(たとえばls)がある場合は、リストで指定されたディレクトリにある最初の実行可能ファイルが使用されます$PATH。スクリプトは実行可能なので、バイナリファイルである必要はありません。 (パス名にコマンドが/含まれている場合は、現在のディレクトリが相対パス名の始点になり、直接使用されます。)

潜在的な要件についてもっと考えてみてください。たぶん、MYAPP_DIRアプリケーション実行可能ファイルが格納されているディレクトリを指す独自の環境変数(たとえば)を定義する必要があります。これにより、常に$MYAPP_DIR/myutilityユーザーの正確性に頼るのではなく、同等のものを呼び出すことができます。$PATH

おすすめ記事