web-dev-qa-db-ja.com

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

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

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

50
Leonid

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

49
coneslayer

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

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

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

  • エイリアス

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

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

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

19
John T

これは他の何人かによってよく答えられましたが、私はいくつかの考えを追加したいと思います:

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

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

$ PATHを左から右に読んで、最初に見つかった場所で停止します。

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

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

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

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

つまり、コマンドを実行するエイリアスまたは関数があった場合、それは実行されます(混乱を招くのは申し訳ありません)。または、シェルにロケーションキャッシュがあり、実行可能ファイルがキャッシュ内にあった場合、それが検出される可能性があります。したがって、それはneverをPATHで見つけますが、他の方法で実行される可能性があります。

8
Rich Homolka

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

次に、検索の順序がわかります。同じ名前のファイルが複数ある場合は、実行する____を実行してください。

例.

system#>どのgrep

/ usr/bin/grep

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

適切なgrep

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

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

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

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

等々...

4
mbb