Linuxコマンドwhichの使い方と2つのオプション

Linuxコマンドwhichは、さまざまなコマンドを使用する際に、そのコマンドがシステムのどこに位置しているかを確認する場合に便利です。たとえば、同じ名前のコマンドが複数のディレクトリに存在する場合、システムがどのパスのコマンドを優先して使用しているかを知りたいときに、whichコマンドが非常に役立ちます。今回の投稿では、Linuxコマンドwhichの使用方法と主要なオプション、そして活用方法についてご紹介します。

Linuxコマンドwhichとは?

Linuxコマンドwhichは、ユーザーが入力したコマンドの実際のパスを見つけ出すLinuxユーティリティです。つまり、特定のコマンドがシステムのどの場所にあるのかを確認できます。これにより、どのプログラムが実行されるか、またパスの問題による衝突を防ぐことができます。

基本使用法

whichコマンドの基本的な使用法は非常に簡単です。次のように使用します:

which [コマンド名]
ShellScript

たとえば、pythonコマンドがどこにあるのか確認したい場合、次のように入力します:

which python
ShellScript

このコマンドを実行すると、システムはPATH環境変数に定義されたディレクトリから「python」という名前の実行ファイルを検索し、最初に見つかったパスを出力します。以下の図では、ホームディレクトリ配下のanaconda3/bin内にpythonファイルがあることが確認できます。

図1. Linuxコマンドwhich: 使用結果
図1. Linuxコマンドwhich: 使用結果

PATH環境変数とは?

whichコマンドを理解するには、まずPATH環境変数について知る必要があります。PATHは、シェル(コマンドインタプリタ)がコマンドを実行する際に、実行ファイルを探すために検索するディレクトリのリストを含んでいる環境変数です。whichコマンドは、このPATHに定義されたディレクトリを順番に探索して、コマンドのパスを見つけ出します。

PATH変数は次のコマンドで確認できます:

echo $PATH
ShellScript

このコマンドを実行すると、以下の図のようにコロン(:)で区切られた複数のパスが表示されます。これらのパスは、シェルがコマンドを探すために検索する順序です。

図2. 環境変数$PATH確認
図2. 環境変数$PATH確認

主要オプション説明

whichコマンドには、いくつかの便利なオプションがあります。これらのオプションを使用すると、より詳細な情報を得ることができます。

-aオプション: すべてのパスを表示

通常、whichコマンドは最初に見つかったパスのみを出力します。しかし、-aオプションを使用すると、同じ名前を持つすべての実行ファイルのパスを表示することができます。たとえば、次のように使用します:

which -a conda
ShellScript

このコマンドを使用すると、「conda」という名前のすべての実行ファイルが存在するパスが出力されます。特定のコマンドが複数のディレクトリに存在する場合、これにより衝突を防ぐか、優先順位を確認することができます。

図3. Linuxコマンドwhich: -aオプションを使ってPATHにあるすべての実行ファイルを表示
図3. Linuxコマンドwhich: -aオプションを使ってPATHにあるすべての実行ファイルを表示

-sオプション: 出力を抑制

時には、パスを出力せずに単にコマンドが存在するかどうかを確認したいことがあります。その場合は、-sオプションを使用します。このオプションを使用すると、パスは出力されず、コマンドが存在すれば成功コード(0)、存在しなければ失敗コード(1)を返します。

which -s python
ShellScript

下の図では、pythonは存在し、python5は存在しないことがわかります。

図4. Linuxコマンドwhich: -sオプションで出力を抑制し、変数で受け取る
図4. Linuxコマンドwhich: -sオプションで出力を抑制し、変数で受け取る

このコマンドは何も出力しませんが、$?を使用して返り値のコードを確認することができます。この方法は、シェル上で使用するよりも、スクリプトで特定のコマンドがインストールされているかどうかを確認する際に便利です。

活用例

スクリプトでの活用

たとえば、スクリプトで特定のコマンドが存在するかを確認し、存在しなければエラーメッセージを出力して終了するように作成できます:

#!/bin/bash

if which -s python; then
    echo "Python is installed."
else
    echo "Python is not installed."
    exit 1
fi
ShellScript

このスクリプトは、pythonコマンドが存在するかを確認し、その結果に応じてメッセージを出力します。もしpythonがインストールされていなければ、スクリプトは終了コード1と共に終了します。

pythonがインストールされている場合、上記のスクリプトを実行すると以下のように表示されます。

図5. Linuxコマンドwhich: スクリプトでの活用
図5. Linuxコマンドwhich: スクリプトでの活用

コマンドパス確認とトラブルシューティング

Linuxシステムでプログラムが予期しない動作をした場合、whichコマンドを使用してどのパスのプログラムが実行されているかを確認することができます。たとえば、特定のプログラムのバージョンを確認した際に、意図したバージョンでなければ、whichコマンドでプログラムパスを確認し、パスが正しいかをチェックできます。

注意点

whichコマンドは、PATH変数に設定されたディレクトリでのみコマンドを検索します。もしPATHに含まれていないディレクトリにあるコマンドを探そうとする場合、whichコマンドはそのコマンドを見つけられません。したがって、特定のディレクトリにインストールされたプログラムを探す際は、まずPATH変数の設定を確認するか、そのディレクトリを直接探索する必要があります。

また、whichは通常、bashやzshなどのシェルで使用され、システム環境やユーザーのシェル設定によって動作が異なる場合があります。

まとめ

Linuxコマンドwhichは、シンプルながら非常に有用なツールです。コマンドのパスを確認し、複数のバージョンのプログラムが存在する場合に優先順位をチェックするのに役立ちます。スクリプト作成時にも、コマンドの存在を迅速に確認できるため、エラーを防ぐことができます。しかし、whichコマンドが検索できる範囲はPATH変数に限定されるため、この点を考慮して使用する必要があります。

さっそくwhichコマンドを活用して、システム管理やスクリプト作成に役立ててみましょう!

リファレンス

関連ポスト

コメントする