次のいずれかのパスが優先されます。/usrまたは/usr/local

次のいずれかのパスが優先されます。/usrまたは/usr/local

aptを使ってaria2cをインストールしたので、aria2cコピーして手動でインストールしたいと思います。/usr/local/bin/usr/bin

入力すると、次のいずれかが実行されますかaria2c

答え1

実行される実行可能ファイルは、変数のディレクトリの順序によって異なりますPATH

/usr/bin前にリストされている場合は代わりに実行され/usr/local/binます。/usr/bin/aria2c/usr/local/bin/aria2c

シェルが実行可能ファイルをハッシュしてaria2cから同じユーティリティをインストールする前にその実行可能ファイルにアクセスした場合は、ディレクトリの順序に関係なくそれを行うことを選択できます。この問題は、ユーティリティを使用して別の場所にインストールし、同じシェルセッションで再利用しようとする特定の場合にのみ発生する可能性があります。このコマンドは、シェルセッションで記憶されたユーティリティの場所を消去します。また、見ることができます/usr/bin/usr/local/bin/usr/bin/aria2cPATHhash -rBashの実行可能ファイルパスキャッシュを消去する方法は?

というエイリアスまたはシェル関数がある場合、シェルは実行可能ファイルを見つけるためにそれを使用する前に使用されますaria2cPATH


個人用(Linux以外)システムでは:

$ printf '%s\n' "$PATH" | tr ':' '\n'
/usr/bin
/bin
/usr/sbin
/sbin
/usr/X11R6/bin
/usr/local/bin
/usr/local/sbin
/usr/games

ご覧のとおり、私のシステムでは/usr/local/bin非常に時間がかかりました。/usr/bin私はこう設定しました。避ける誤って再定義されました/usr/bin。ローカル実行可能ファイルが/usr/bin

答え2

このSEサイトで回答が見つからないのが不思議です。

PATHこれはシェルによって異なりますが、通常はコマンドを実行するためにシェルが確認するディレクトリを含む環境変数があります。これらのディレクトリはセミコロンで区切られています:

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/wine/bin:/home/birdie/bin

バイナリは左から右に検索されます。つまり、私の例では、同じバイナリがある場合は、/usr/local/binその/binうちの1つが/usr/local/bin優先順位を持ちます。

また、シェルにエイリアスがある場合、サポートされている機能が最初に実行されます(エイリアスが定義されている場合)。aliasとを実行して表示できますset。別のカテゴリコマンドがありますbuilt-in。したがって、順序は次のようになります。

  • ニックネーム
  • 機能
  • 組み込みコマンド
  • $PATH左から右に検索されるバイナリファイル

最後に注目する価値があるのはエイリアスです。いいえシェルスクリプトで動作します(定義されていません)。

答え3

より簡単な解決策は、which実行されるプログラムを見ることです。

マンページ...

このパラメータがシェルプロンプトに入力されると、実行される実行可能ファイルのフルパスが標準出力に出力されます。

例:

[~] echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/lib/llvm/13/bin:/usr/lib/llvm/12/bin
[~] echo '#!/bin/bash' > hello_world.sh
[~] echo 'echo "Hello World"' >> hello_world.sh
[~] chmod 755 hello_world.sh 
[~] sudo cp hello_world.sh /bin/
[~] sudo cp hello_world.sh /usr/bin/
[~] sudo cp hello_world.sh /usr/local/bin/
[~] which hello_world.sh
/usr/local/bin/hello_world.sh

次へ追加

hashコマンドの実行方法を変更できることが私の注目を集めました。ただし、ほとんどの場合、プログラムはパフォーマンスを向上させるためにハッシュされません。私のハッシュリストには常に2つのコマンドしかありません。

[~] hash
hits    command
   3    /usr/bin/man
   1    /bin/bash

コマンドをハッシュしない限り、whichコマンドは問題ありません。または代わりに使用してくださいtype -p hello_world.sh。このコマンドも同様のtype部分です。なんだかお互いにコミュニケーションになると思います。bashhash

保存するには、hashパラメータなしでコマンドを呼び出してすべてのハッシュプログラムを表示できます。

関連情報