Linux の
which
コマンドは、シェルにコマンドを発行したときに起動される実行可能バイナリを識別します。コンピュータ上に同じプログラムの異なるバージョンがある場合は、どのバージョンをシェルが使用するかを調べるために、
which
を使用できます。
バイナリとパス
ターミナル ウィンドウからプログラムまたはコマンドを実行しようとすると、シェル (通常、最新のディストリビューションでは Bash ) がそのコマンドを見つけて起動する必要があります。 cd 、 history 、 pwd などの一部のコマンドはシェルに組み込まれているため、Bash がこれらを見つけるのにそれほど苦労する必要はありません。
しかし、Bash はどのようにして他のコマンド、プログラム、外部スタンドアロン バイナリを見つけるのでしょうか? Bash はパスを使用しますが、これは実際にはパスのコレクションであり、それぞれがディレクトリを指します。次に、これらの各ディレクトリで、実行しようとしているコマンドまたはプログラムに一致する実行可能ファイルを検索します。見つかった場合、Bash はそれを起動し、検索を放棄します。
使用できます
echo
を確認するために
$PATH
環境変数を参照して、パス内のディレクトリを確認します。これを行うには、次のように入力して Enter キーを押します。
エコー $PATH
出力リストは、各パスをコロン (:) で区切ります。私たちが使用しているコンピューターでは、Bash は次のディレクトリをこの順序で検索します。
-
/usr/local/sbin -
/usr/local/bin -
/usr/sbin -
/usr/bin -
/sbin -
/bin -
/user/games -
/usr/local/games -
/snap/bin
ファイル システムには
/sbin
および
/bin
という名前のフォルダーが多数あるため、混乱が生じる可能性があります。
それらの道を見守ってください
htg
というプログラムの更新バージョンがあるとします。これは現在のディレクトリにあり、次のコマンドを入力して実行できます。
./htg
これは大したプログラムではありません。バージョン番号を出力して終了するだけです。新しいバージョンは 1.2.138 です。
現在の作業ディレクトリでプログラムを実行するには、プログラム名の前に「./」を入力する必要があります。これにより、プログラムがどこにあるかを Bash が認識できるようになります。
この特定のプログラムを任意のディレクトリから実行したいため、実行可能ファイルを
/usr/bin
ディレクトリに移動します。 Bash はパス内でそのプログラムを見つけて実行します。
現在のディレクトリに実行可能ファイルを置く必要はありません。また、以下に示すように、プログラム名の前に「./」を入力する必要もありません。
sudo mv htg /usr/bin
次に、次のように入力してプログラムを実行してみましょう。
htg
何かが実行されますが、それは新しく更新されたプログラムではありません。むしろ、それは古いバージョン、1.2.105 です。
どのコマンド
上で示した問題は、
which
コマンド
が設計されたの
かということです。
この例では、
which
使用し、調査しているプログラムの名前をコマンド ライン パラメーターとして渡します。
どのhtg
which
/usr/local/bin
ディレクトリに
htg
のバージョンが見つかったことを報告します。この場所は、更新された
htg
を移動したディレクトリの前のパスにあるため、Bash はその以前のバージョンのプログラムを使用します。
ただし、以下に示すように
-a
(all) オプションを使用すると、一致するものが見つかった場合でも
which
が続行されます。
どの -htg
次に、パス内のいずれかのディレクトリにある一致するものをすべてリストします。
つまり、それが問題です。パッチ内にもあるディレクトリに、以前のバージョンのプログラムが存在します。そして、そのディレクトリは、プログラムの新しいバージョンをドロップしたディレクトリよりも前に検索されます。
確認するには、次のように入力し、プログラムの各バージョンを明示的に実行します。
/usr/local/bin/htg
/usr/bin/htg
これで問題の説明がつき、解決策は簡単です。
実際には、オプションがあります。
/use/local/bin
ディレクトリ内の古いバージョンを削除するか、
/usr/bin
から
/usr/local/bin
に移動します。
結果を見てください
2 つの結果は、必ずしも 2 つのバイナリ ファイルを意味するわけではありません。
-a
(all) オプションを指定して
which
コマンドを使用し、
less
プログラムのバージョンを探す例を見てみましょう。
どちらが少ないですか
which
、
less
プログラムのバージョンを収容する 2 つの場所を報告していますが、それは本当でしょうか? Linux コンピュータに、
less
の 2 つの異なるバージョン (または複数の場所に同じバージョン) がインストールされているのは奇妙です。したがって、
which
からの出力を受け入れるつもりはありません。代わりに、もう少し深く掘り下げてみましょう。
ls
、
-l
(長いリスト)、および
-h
(人間が判読できる) オプションを使用して、何が起こっているかを確認できます。
ls -lh /usr/bin/less
ファイル サイズは 9 バイトと報告されています。それは間違いなく、
less
の完全なコピーではありません。
リストの最初の文字は「l」です。通常のファイルの最初の文字はハイフン (-) です。 「l」はシンボリックリンクを意味する記号です。詳細を見逃した場合は、
-->
記号もこれが
シンボリック リンク
であることを示しており、一種のショートカットと考えることができます。これは、
/bin
内の
less
のコピーを指します。
/bin
にある
less
のバージョンを使用して再試行してみましょう。
ls -lh /bin/less
このエントリは明らかに「本物の」バイナリ実行可能ファイルです。リストの最初の文字はハイフン (-) であり、これは通常のファイルであり、ファイル サイズが 167 KB であることを意味します。したがって、
less
のコピーは 1 つだけインストールされますが、別のディレクトリからそのコピーへのシンボリック リンクがあり、Bash がパスを検索するときにこれも見つけます。
複数のコマンドを一度に確認する
複数のプログラムやコマンドを渡す
which
、それらを順番にチェックします。
たとえば、次のように入力すると、
どの ping 猫の稼働時間の日付の頭
which
指定したプログラムとコマンドのリストを処理し、それぞれの結果をリストします。
どっちがどっち?
どうしてもその気になれば、次のように入力して
which
自体を使用することもできます。
どれどれ
好奇心から Linux ファイル システムを調べてみることは別として、
which
、コマンドやプログラムからある動作セットを期待していても、別の動作セットが得られる場合に最も役立ちます。
このような場合は、
which
使用して、Bash が起動しているコマンドが使用したいものであることを確認できます。
関連: 開発者と愛好家のための最高の Linux ラップトップ





