次のような状況では何が起こるのか疑問に思っています。.bashrc の PATH にあるディレクトリに実行可能ファイルがあるとします。そのファイルを PATH に設定されている別のディレクトリにコピーし、ターミナルからそのファイルを実行すると、どのコピーが実行されるのでしょうか?
「PATH 内の複数の場所にファイルが存在する場合は、2 番目の場所ではなく 1 番目の場所でそのファイルを実行する」という設定を行うことはできますか。
答え1
簡単な答え
どのコピーが実行されるかを調べるにはbash
、bash の組み込みユーティリティ を使用します。たとえば、type
のどのコピーが実行されるかを調べるには、次のコマンドを実行します。du
$ type du
du is /usr/bin/du
その理論
何かを実行するように要求するとbash
、bash
次の 2 つの手順が実行されます。
まず、ファイルの場所をキャッシュで確認します。これは、実行可能ファイルの名前と、最後にbash
実行されたときにファイルが配置されていた場所のリストです。
次に、ファイルがキャッシュ内にない場合は、パスをチェックし、パス内の各ディレクトリを左から右に検索します。
答えは、コピーする前に現在のシェルで実行ファイルを実行したかどうかによって異なります。実行した場合、bash
その場所がキャッシュに保存されている可能性があります。無視するコピーを作成した後の新しい場所。キャッシュにない場合は、どのファイルが実行されるかはパス内のディレクトリの順序によってのみ決まります。
詳細情報
bash の現在のキャッシュに何が含まれているかを確認するには、次のコマンドを実行します。
$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'
上記は、du
これを実行したときにキャッシュにあったのは のみであることを示しています。さらにコマンドを実行してから再度実行すると、キャッシュにさらに多くのコマンドが含まれることになります。
現在のパスを確認するには、次のコマンドを実行します。
$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:/usr/X11R6/bin
パスはコロンで区切られたリストです。上記ではパス内の 5 つのディレクトリを示しています。これらは左から右へと検索されます。
好みを設定することはできますか?
はい、パス内のディレクトリの順序を変更できます。
あるいは、インタラクティブな作業の場合は、エイリアスを設定することもできます。例:
$ alias dd=/opt/bin/dd
上記のエイリアスが設定された後、dd
コマンド ラインで と入力すると、bash
キャッシュと PATH を無視して実行 (または実行を試行) できます/opt/bin/dd
。