Unixは実行可能ファイルをどのように検索しますか?


47

ファイルが実行されると、Unixはどのように検索しますか?PATHに同じ名前の複数の実行可能ファイルがある場合、どちらが優先されますか?ファイルの実行時に現在のディレクトリが検索に含まれていますか?

executable.sh現在のディレクトリに名前の付いたファイルがあると仮定します。それが実行され$ executed、の.一部ではない場合、それは動作しPATHますか?


which <executable>このスレッドでは、コマンドに言及するのが便利です。
会計士م

回答:


45

$ PATHは最初から最後まで検索され、最初に一致する実行可能ファイルが実行されます。したがって、$ PATHの先頭にあるディレクトリは、後で来るディレクトリよりも優先されます。現在のディレクトリ(。)内の実行可能ファイルは、の場合にのみ実行されます。$ PATHにあります(通常はありません)。検索パスに現在のディレクトリを暗黙的に含めることはありません。


私の$ PATHにが含まれていないのは奇妙ですが、.$ PATH自体で定義されたディレクトリをチェックする前に、最初に現在のディレクトリから検索するようです。
エリックワン

19

現在のディレクトリにあるファイルの場合、ファイルの前にを付けると./コマンドがになり./executable.shます。.他の問題の中でも特に、セキュリティリスクを引き起こすため、PATHに絶対に入れないでください。

PATHで最初に検索され、最初に検索されるディレクトリ。

正しく覚えていれば、検索の全体的な順序は次のようになります。

  • エイリアス

  • エクスポートされた関数

  • 組み込みシェルコマンド

  • PATH内のスクリプトとバイナリ


7
ハッシュを追加します-bash(および他のシェル)が最近使用したコマンドのハッシュを保持して、それらを見つけやすくすることを忘れないでください。hash -rPATHまたはプログラムの場所を変更した場合、キャッシュを(を使用して)パージしなければならない場合があります。
リッチホモルカ

3
検索の順序に対して+1。情報源を思い出せたらいいと思います:)
twan163

8

これは他の一部の人からはよく回答されていますが、いくつかの考えを追加したいと思います。

1)PATHは、呼び出された実行可能ファイルにパス要素がない場合にのみ参照されます。somecommandは$ PATH ./somecommandまたは/usr/bin/somecommandで検索されるか、../../bin/somecommandPATHではなくディレクトリルールを使用します。

同じ名前の複数の実行可能ファイルがPATHにある場合、どれが優先されますか?

最初に見つかったもので停止し、$ PATHを左から右に読み取ります。

ファイルの実行時に現在のディレクトリが検索に含まれていますか?

現在のディレクトリがPATHにある場合、検索されます。PATHの空のディレクトリには現在のディレクトリが含まれることに注意してください。例:PATH =:/ usr / bin(先頭が空)PATH = / usr / bin:(末尾が空)およびPATH = / usr / bin :: / bin(中央が空)はすべて、現在の作業ディレクトリを効果的に含みます。

現在のディレクトリにexecutable.shという名前のファイルがあると仮定します。それが実行された場合、それは機能しますか?PATHの一部ではありませんか?

PATHを検索しても見つけられません。現在のディレクトリがPATHにない場合、PATHルックアップではそれを見つけられません。

ただし、コマンドを実行したエイリアスまたは関数があれば、それが実行されます。または、シェルにロケーションキャッシュがあり、実行可能ファイルがキャッシュにあった場合、それが見つかる可能性があります。だから、それはなります決して PATHにそれを見つけていないが、それは他の手段によって実行することができます。


cache注のおかげで、古い実行可能ファイル/usr/bin/がまだの新しい実行ファイルではなくまだ呼び出されていることに夢中になりますが、ログアウトしてから再びログインするまで/usr/local/bin左側に$PATHあります。
会計士م

1
あなたは、シェルキャッシュ消去するために「ハッシュ-r」を実行することができますbashで@theaccountant
リッチHomolka

4

現在のパスを確認するには、単にecho $PATHまたはを入力しprintenv PATHます。

その後、検索の順序がわかります。同じ名前のファイルが複数ある場合は、どの____を実行するだけで確認できます。

system#> grep

/ usr / bin / grep

ターゲットのように機能するファイルを見つけるクールな方法は、aproposを使用することです。

apropos grep

bzgrep(1)-おそらくbzip2で圧縮されたファイルで正規表現を検索する

egrep(1)-パターンに一致する行を出力

fgrep(1)-パターンに一致する行を出力

grep(1)-パターンに一致する行を印刷する

等々...


2
そうそう- ファイルのすべてのインスタンスを見つけるためにwhereis関数を忘れました:> whereis grep
mbb

grep:/ bin / grep / usr / bin / grep /usr/share/man/man1/grep.1.gz
mbb

whereisではなく、ハードコードされた場所のリストを使用し$PATHます。
悲しみ

@grawityそれについて拡張していただけますか?
WinEunuuchs2Unix

-2

@ coneslayer-実行可能ファイルを見つけるデフォルトの順序は、現在のパス、組み込みコマンド、そして$ PATHです。したがって、executableという名前の関数がpwdに既に存在する場合、それは実行されます。そうでない場合、優先順位はシェルの組み込みコマンドを検索し、次に$ PATH


40年前のトンプソンシェル、マシェイシェル、または化石化された他のホールドオーバーについて話していたなら、あなたは正しいかもしれません。しかし、現在の主流のUnixシェルは、現在のディレクトリを自動的に検索しません。
スコット

@Scottしたがって、コマンドのデフォルトの検索パスが最初に組み込まれ、次に$ PATHが組み込まれ、。/を指定した場合にのみCWDが検索されます。私は正しいですか?
proc

まあ、エイリアス、関数、組み込み関数。次に、コマンドでパス(を含む./)を指定すると、そのディレクトリのみが検索されます。それ以外の場合は、検索します$PATH
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.