LinuxなどのUNIX系オペレーティングシステムを利用していると、端末(ターミナル)からコマンドを入力して実行する機会が数多くあります。
しかし、今実行しようとしているコマンドが、システムのどのディレクトリに配置されている実体(バイナリファイル)を参照しているのかを意識することは少ないかもしれません。
同じ名前のコマンドが複数の場所にインストールされている場合や、自分でインストールした新しいバージョンのツールが正しく認識されているかを確認したい場面において、コマンドのパス(所在)を確認する作業は非常に重要です。
そこで役立つのがwhichコマンドです。
本記事では、Linuxでの開発や運用において欠かせないwhichコマンドの基本から、他のコマンドとの違い、実務で役立つテクニックまでを詳しく解説します。
whichコマンドとは:役割と基本的な仕組み
Linuxにおいて、ユーザーがコマンドを入力した際、シェル(Bashなど)はあらかじめ設定されたディレクトリのリストを順番に探しに行きます。
このリストを保持しているのが環境変数$PATHです。
whichコマンドは、指定されたコマンド名を環境変数$PATHに基づいて検索し、最初に見つかった実行ファイルのフルパスを表示するツールです。
これにより、ユーザーは「今、どのファイルが実行されようとしているのか」を即座に把握することができます。
例えば、PythonやNode.jsなどのランタイムを複数のバージョンで管理している環境では、意図しない古いバージョンの実行ファイルが優先的に参照されていることがあります。
このようなトラブルシューティングの第一歩として、whichコマンドによるパス確認は極めて有効です。
whichコマンドの基本的な使い方
whichコマンドの使い方は非常にシンプルです。
基本的には、確認したいコマンド名を引数として渡すだけです。
1つのコマンドのパスを確認する
最も一般的な使い方は、特定のコマンドがどこにあるかを確認することです。
# lsコマンドの場所を確認する
which ls
/usr/bin/ls
上記の結果から、lsコマンドの実体は/usr/bin/ディレクトリ配下にあることがわかります。
複数のコマンドを同時に確認する
whichコマンドには複数の引数を渡すことが可能です。
スペース区切りでコマンド名を並べることで、一度に複数の実行パスを表示できます。
# python3 と git の場所を同時に確認する
which python3 git
/usr/bin/python3
/usr/bin/git
複数の開発ツールが正しくパスの中に含まれているかを一括でチェックする際に便利です。
whichコマンドで重要なオプション活用術
whichコマンドにはいくつかのオプションが存在しますが、実務で最も頻繁に利用されるのが-aオプションです。
-aオプション:すべての候補を表示する
通常、whichコマンドは環境変数$PATHを左から順に検索し、最初に見つかったパスを表示して終了します。
しかし、同じ名前のコマンドが複数のディレクトリに存在する場合、それらすべてを確認したいことがあります。
# -a オプションを使用して、システム内に存在するすべての python3 を探す
which -a python3
/usr/local/bin/python3
/usr/bin/python3
この例では、/usr/local/bin/と/usr/bin/の両方にpython3が存在していることがわかります。
whichコマンド(オプションなし)を実行した場合は、より優先度の高い/usr/local/bin/python3が表示されます。
もし、新しくインストールしたはずのコマンドが反映されない場合は、この-aオプションを使い、意図しない古いパスが優先されていないかを確認しましょう。
環境変数$PATHとwhichコマンドの関係
whichコマンドの動作を深く理解するためには、環境変数$PATHの仕組みを知る必要があります。
Linuxシステムは、コマンドが入力されると$PATHに定義されたディレクトリを左側から順番にスキャンします。
現在の自分の環境で設定されているパスを確認するには、以下のコマンドを実行します。
# 環境変数 $PATH の中身を表示する
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
パスはコロン(:)で区切られています。
whichコマンドはこの文字列を分解し、それぞれのディレクトリの中に指定された実行ファイルが存在するかをチェックしているのです。
もしどのディレクトリにも見つからなかった場合、whichコマンドは何も出力せず、終了ステータスとして「1」を返します。
whichコマンドが効かないケース:エイリアスとシェル関数
便利なwhichコマンドですが、万能ではありません。
実は、Bashなどのシェルには「外部コマンド」以外にもコマンドを実行する仕組みがあります。
それがエイリアス(Alias)とシェル関数(Function)、そしてシェル組み込みコマンド(Built-in)です。
エイリアスの確認
多くのLinuxディストリビューションでは、lsコマンドに色がつくようにalias ls='ls --color=auto'のような設定がなされています。
しかし、標準的なwhichコマンドはこれらのエイリアスを無視してバイナリファイルの場所のみを表示することがあります(※シェルの実装や設定によってはエイリアスを表示する場合もあります)。
組み込みコマンドの確認
例えば、cdコマンドはシェルの組み込みコマンドであり、独立した実行ファイルとして存在しません。
# cdコマンドのパスを確認しようとする
which cd
/usr/bin/which: no cd in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
このように「no cd in…」と表示され、パスが見つからないという結果になります。
これは、whichコマンドが「ファイルシステム上の実行ファイル」のみを探すツールであるためです。
whichの代わりになる強力なコマンド:type
whichコマンドの限界(エイリアスや組み込みコマンドを判別できない点)を補うのが、typeコマンドです。
プロのエンジニアは、より正確な情報を得るためにこちらを好んで使うことも多いです。
typeコマンドの使い方
# typeコマンドでlsを確認
type ls
# typeコマンドでcdを確認
type cd
ls is aliased to `ls --color=auto'
cd is a shell builtin
typeコマンドを使用すると、それがエイリアスなのか、組み込みコマンドなのか、あるいは外部ファイルなのかを明確に教えてくれます。
| 特徴 | whichコマンド | typeコマンド |
|---|---|---|
| 検索対象 | $PATH上の実行ファイル | エイリアス、関数、組み込み、ファイル |
| 主な用途 | バイナリの絶対パス確認 | コマンドの正体・優先順位の確認 |
| 外部コマンド | 外部コマンドとして存在 | シェルの組み込みコマンド |
その他の関連コマンド:whereisとcommand
コマンドの場所を探すためのツールは他にもいくつかあります。
用途に合わせて使い分けることで、作業効率が向上します。
whereisコマンド
whereisコマンドは、実行ファイルだけでなく、ソースコードやマニュアル(man)ファイルの場所も併せて検索します。
# whereisでlsの関連情報を探す
whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
バイナリの場所だけでなく、ドキュメントの場所も知りたい場合に有用です。
command -v コマンド
シェルスクリプト内で「あるコマンドが存在するかどうか」をチェックする場合、whichコマンドよりもcommand -vが推奨されます。
# command -v の実行
command -v python3
/usr/bin/python3
command -vはPOSIX準拠の書き方であり、whichコマンドがインストールされていない環境や、whichの挙動が異なるOS間でもポータビリティ(移植性)の高いスクリプトを書くことができます。
実践テクニック:シェルスクリプトでの活用例
whichコマンドや前述のcommand -vは、自動化スクリプトの中で「依存するツールがインストールされているか」のバリデーションによく使われます。
#!/bin/bash
# 必要なコマンドの存在チェックを行う関数
check_command() {
if ! command -v "$1" > /dev/null 2>&1; then
echo "エラー: $1 がインストールされていません。"
exit 1
fi
}
# 実行前にチェック
check_command "git"
check_command "docker"
echo "すべての依存コマンドが見つかりました。処理を開始します..."
このように記述することで、スクリプトが途中で「command not found」となって異常終了するのを防ぎ、ユーザーに親切なエラーメッセージを表示できます。
セキュリティ面での注意点:パスの順序に潜むリスク
whichコマンドで実行パスを確認することは、セキュリティ上のリスクを回避するためにも重要です。
もし、悪意のあるユーザーがあなたのホームディレクトリなど、システム標準のパスよりも優先順位の高いディレクトリに「偽のlsコマンド」を置いたとしましょう。
環境変数$PATHの設定が不適切(例えば、現在のディレクトリ . が先頭に含まれているなど)だと、知らないうちに偽のコマンドを実行してしまう危険性があります。
「いつもと動作が違う」と感じたときは、すぐにwhich -aを実行し、意図しない場所からコマンドが読み込まれていないかを確認する習慣をつけましょう。
まとめ
Linuxにおけるwhichコマンドは、コマンドの実行パスを素早く特定するためのシンプルかつ強力なツールです。
which コマンド名:標準的な実行パスを表示。which -a コマンド名:重複するすべての候補を表示。- エイリアスや組み込みコマンドを調べたいときは
typeコマンドを利用。 - シェルスクリプトでの存在チェックには
command -vが最適。
これらのコマンドを適切に使い分けることで、環境構築時のトラブルシューティングや、安全なシステム運用の助けとなります。
まずは自分のよく使うコマンドがどこに配置されているのか、whichを使って覗いてみることから始めてみてはいかがでしょうか。
