Linux / コマンド / which - PATHで実行ファイルのパスを探す

whichは、シェルのPATHに列挙されたディレクトリを検索して、実行可能ファイルのパスを表示します。外部コマンドのインストール場所を素早く確認できますが、エイリアス、関数、組み込みコマンドまで正確に判別するには、シェルのtypeやcommand -vの方が適しています。

この記事ではwhichの基本的な文法と主なオプション、実際の使用例、関連コマンドとの違い、使用時の注意点について説明します。

whichコマンドとは?

一般的にPATHディレクトリを先頭から確認して最初に見つかった実行ファイルを出力します。whichは外部プログラムである場合やシェル専用のラッパである場合があり、動作やオプションはシステムによって異なります。シェルが実際にどのコマンドを選択するかや結果が常に同じであるとは仮定しないでください。

基本的な文法

which [オプション] コマンド ...

オプションや詳細な動作は実装やバージョンによって異なる場合があります。現在のシステムではwhich --helpとman whichでインストールされたコマンドの説明を確認してください。

whichの基本的な使い方

実行ファイルパスの確認

PATHで最初に見つかった実行可能ファイルのパスを出力します。

which python3

複数コマンドの確認

コマンド名を複数指定して、インストール状況とパスを一度に確認します。

which sh awk sed

すべての一致するパスを見る

サポートされている実装では、PATH内のすべての一致を-aで表示します。

which -a python3

実行ファイルパスの出力の制限

whichは、PATHで見つかった実行ファイルのパスを表示します。システムとシェルによって、同じコマンドでも場所が異なります。

which ls

例の出力:

/usr/bin/ls

シェルのエイリアスや関数は、whichの出力と実際に入力したコマンドの解釈が異なる場合があります。現在のシェルが何を実行するかは、type lsまたはcommand -V lsで確認してください。

主なオプション

オプション 説明
-a, --all 最初の結果だけでなく、PATHのすべての一致するパスを出力します。
--skip-alias GNU版で--read-aliasによるエイリアス定義の読み取りを無視します。親シェルのエイリアス自体を解除する指定ではありません。
--skip-functions GNU版で--read-functionsによる関数定義の読み取りを無視します。シェル関数自体は変更しません。
--version インストールされている which の実装とバージョンを確認します。

実践的活用例

同じコマンドの優先順位を確認する

-a の結果と PATH の順序から、PATH上の外部実行ファイルの候補順がわかります。シェルが記憶したコマンドのパスや関数などが優先される場合もあるため、実際の解釈はシェル側でも確認してください。

which -a python3
printf '%s\n' "$PATH"

シェルが解釈するコマンドの種類を確認する

エイリアスや関数、組み込みコマンドまで含めるには、シェルの組み込み機能を併用します。詳しい分類はtypeコマンドの使い方で確認できます。

type -a ls
command -V ls
command -v ls

スクリプトで存在の有無を確認する

POSIX(Unix系システム間の共通仕様)に沿うスクリプトでは、command -vによるコマンドの確認が使えます。ただし成功しても、関数や組み込みコマンドである可能性があります。外部プログラムだけを確認したい場合は、返る値やコマンドの種類も区別してください。

if command -v curl >/dev/null 2>&1; then
  printf '%s\n' 'curl 利用可能'
fi

which と関連コマンドの比較

コマンド 主な役割 適した状況
which PATH 外部実行ファイルの検索 簡単なパス確認
command -v シェルコマンドの解釈結果 ポータブルスクリプトの確認
type エイリアス・関数・組み込み・ファイルの区別 対話型診断
whereis 標準場所の関連ファイル検索 バイナリ・ソース・マニュアルの場所

使用する際の注意点

エイリアスや関数を見逃すことがあります

シェルは外部ファイルよりもエイリアスや関数を先に実行することがあるため、typeで確認します。

実装はシステムによって異なります

オプションをスクリプトで使用する前に、インストールされている which のヘルプを確認してください。

セキュリティ検証ツールではありません

パスが見つかったからといって、ファイルの所有者、権限、完全性が安全であるという意味ではありません。

FAQ

which が何も出力しなければ、インストールされていないのでしょうか?

通常はPATH上で実行ファイルを見つけられなかったという意味で、PATH外にインストールされている可能性もあります。組み込みコマンド・関数・エイリアスかどうかは type や command -v で確認してください。

同じコマンドのすべてのパスを確認するには?

サポートされている実装ではwhich -a コマンドを使用します。

スクリプトでwhichを使ってもよいですか?

可能ですが、移植性とシェル解釈の一致のために通常command -vが推奨されます。

whichとwhereisは何が違うのですか?

whichはPATHの実行ファイルを探し、whereisは決められた検索場所でバイナリ・ソース・マニュアルを探します。

参考資料