\r\n\r\n
Linuxのwhichコマンドは、シェルにコマンドを発行したときに起動する実行バイナリファイルを特定するものです。同じプログラムの異なるバージョンがコンピュータ上にある場合、シェルがどちらのバージョンを使用するかを決定するために、whichを使用することができます。
ターミナルウィンドウからプログラムやコマンドを実行しようとすると、シェル(最近のディストリビューションでは通常Bash)がそのコマンドを見つけて起動する必要があります。いくつかのコマンド(cd、history、pwdなど)はシェルに組み込まれているので、Bashが苦労して探す必要はない。
しかし、Bashはどうやって他のコマンドやプログラム、外部のスタンドアロンバイナリを見つけるのでしょうか。Bashはパスを使いますが、これは実際にはパスの集合であり、それぞれがディレクトリを指しています。そして、各ディレクトリを検索して、実行しようとするコマンドやプログラムに一致する実行ファイルを探します。見つけると、Bashはそれを起動し、検索を中止します。
echoを使って、環境変数$PATHを確認し、どのようなディレクトリがパスに含まれているかを確認することができます。これを行うには、次のように入力してEnterキーを押します。
echo $PATH出力リストは、各パスをコロン(:)で区切ります。 今回使用するコンピュータでは、Bashは次のディレクトリを次の順序で検索します。
ファイルシステムには、/**in や /bin という名前のフォルダがたくさんあり、混乱することがあります。
例えば、htgというプログラムの更新版がカレントディレクトリにあり、以下のコマンドを入力することで実行できるとする。
/htg社
プログラムではなく、バージョン番号を表示して終了するだけです。新しいバージョンは1.2.138です。
現在の作業ディレクトリにあるプログラムを実行するには、プログラム名の前に「./」を入力し、Bashがそのプログラムを見つける場所を認識できるようにする必要があります。
このプログラムは任意のディレクトリから実行したいので、実行ファイルを/usr/binディレクトリに移動します。bashはパスの中からプログラムを見つけて実行してくれます。
以下のように、カレントディレクトリに実行ファイルを置く必要はなく、プログラム名の前に"./"を入力する必要もない。
sudo mv htg /usr/binでは、次のコマンドを入力して、プログラムを実行してみましょう。
htg何かが動いていますが、それは新しいアップデートプログラムではなく、古いバージョン1.2.105です。
上で示した疑問は、なぜwhichコマンドが設計されたのかということです。
この例では、whichを使い、調査対象のプログラム名をコマンドラインの引数として渡します。
which htgこのレポートでは、/usr/local/bin ディレクトリに htg のバージョンがあることがわかりました。この場所は、更新されたhtgを移動したディレクトリの前のパスに表示されるため、Bashはそのプログラムの以前のバージョンを使用しています。
ただし、以下のように-a(all)オプションを使用すると、一致するものがあっても検索が継続されます。
which -a htg次に、パス内の任意のディレクトリにあるすべてのマッチをリストアップします。
そこで問題なのですが、このプログラムの以前のバージョンが、パッチの中にもあるディレクトリにあるのです。このディレクトリは、新バージョンのプログラムのためにディレクトリを削除する前に検索されていたものです。
これを確認するために、次のように入力し、各バージョンを明示的に実行することができます。
/usr/local/bin/htg /usr/bin/htgこれは問題を説明するもので、解決方法は簡単です。
実は、私たちには選択肢があるのです。us/local/binディレクトリにある古いバージョンを削除するか、/usr/binから/usr/local/binに移動させるか、どちらかです。
2つの結果は、必ずしも2つのバイナリファイルを意味するものではありません。
whichコマンドと-a (all) オプションを使って、lessプログラムのバージョンを探す例を見てみましょう。
which -a lessless programのバージョンはどの2カ所にあるのか、でもこれは本当なのか?1台のLinuxコンピュータに2種類のlessをインストールする(あるいは同じバージョンを複数個所にインストールする)のはおかしい。だから、そのアウトプットを受け入れないのです。その代わり、もう少し深く掘り下げてみましょう。
ls、-l(long list)、-h(human readable)オプションを使って、何が起こっているかを確認することができます。
ls -lh /usr/bin/lessファイルサイズは9バイトと報告されています!これは間違いなくlessのフルコピーではありません。
リストの1文字目は "l "です。通常のファイルの1文字目はハイフン(-)です。l "はシンボリックリンクを示す記号です。その詳細を無視した場合、-->記号は、これがシンボリックリンクであることも示しており、ショートカットと考えることができます。これは、 less in/bin のコピーを指している。
less in/bin版で再チャレンジしてみましょう。
ls -lh /bin/lessこのエントリーは、どうやら「本物の」バイナリ実行ファイルであるようです。リストの最初の文字がハイフン(-)であることは、ファイルサイズが167KBの通常のファイルであることを意味し、lessのコピーは1つしかインストールされていませんが、他のディレクトリからのシンボリックリンクがあり、Bashもパスを検索する際にこれを見つけることができます。
関連:Linuxでlsコマンドを使ってファイルやディレクトリを一覧表示する方法
複数のプログラムやコマンドを渡すと、順番にチェックしてくれます。
たとえば、こう打つと。
which ping cat uptime date head提供されたプログラムやコマンドのリストを通して動作し、それぞれの結果をリストアップします。
その気になれば、入力すれば単体でも使える。
which which興味本位でLinuxのファイルシステムを閲覧するのは別として、コマンドやプログラムから一連の動作を期待する場合に最も有用です。
このような場合、Bashが起動しているコマンドが自分の使いたいものであるかどうかを確認するために、どちらを使うかを決めるとよいでしょう。