この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:T
更新日時:2026-09-06 15:08:53

タイトル: which コマンドの絶対パスを調べる
SEOタイトル: Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い

この記事の要点
  • which コマンド名 で実行ファイルの絶対パスを表示する
  • which -a で PATH 上のすべての候補を列挙できる
  • シェル組み込み(cd / echo)やエイリアスは which では見えないため、type や command -v を併用する
  • スクリプトでパスを得たいときは POSIX 準拠の command -v が推奨(which は環境により挙動が違う)
  • whereis はバイナリ・マニュアル・ソースを横断的に探す。which はバイナリだけを返すという役割の違いがある

which とは

which はコマンド名を渡すと、その実行ファイルの絶対パスを返してくれるユーティリティです。「いま打った grep は実際どの grep が動いているのか?」を即座に確認できます。

基本構文

which コマンド名 [コマンド名 ...]

基本例

$ which grep
/usr/bin/grep

$ which ls cp mv
/usr/bin/ls
/usr/bin/cp
/usr/bin/mv

$ which nonexistent
$ echo $?
1

見つからなかった場合は何も出力せず、終了ステータス 1 を返します。

仕組み

which は環境変数 PATH を先頭から順に検索し、最初に見つかった実行可能ファイルのパスを返します。PATH の順序が結果を決めるので、複数の同名コマンドが入っている環境では「期待どおりの版が呼ばれているか」を確認するのに必須です。

$ echo $PATH
/home/user/bin:/usr/local/bin:/usr/bin:/bin

$ which python
/usr/local/bin/python    # /usr/local/bin が先なのでこちらが優先

主なオプション

オプション意味
-aPATH 上のすべての候補を列挙
-iエイリアスも考慮(Debian の GNU which)
--read-alias標準入力からエイリアス情報を受け取る
--skip-aliasエイリアスを無視

環境(OS / which の実装)により対応オプションは異なるため、man which や which --help で確認してください。

-a で複数候補を見る

$ which -a python
/usr/local/bin/python
/usr/bin/python

$ which -a php
/usr/local/bin/php
/usr/bin/php

「PATH の順序を変えればどれが優先されるか」を考えるときの判断材料になります。

which の落とし穴

シェル組み込みコマンドが見えない

cd / echo / type / pwd などはシェル組み込み(builtin)です。実体は /usr/bin/echo なども存在しますが、シェルでは組み込み版が優先されます。which はそれを区別せずに外部実行ファイルのパスを返します。

$ which echo
/usr/bin/echo          # ← 実際はシェル組み込みの echo が動いている

$ type echo
echo is a shell builtin

エイリアスが見えない

シェルで alias ll="ls -la" としていても、子プロセスとして起動される which はそれを知りません。エイリアスを含めて確認したい場合は type を使います。

$ alias ll='ls -la'

$ which ll
                       # 何も出ない

$ type ll
ll is aliased to `ls -la'

スクリプトでの利用は非推奨

シェルスクリプトで「コマンドが存在するか」を判定したいとき、which の挙動は OS によって異なるため避けるべきです。POSIX で標準の command -v を使うのが移植性の高い書き方です。

# 移植性の高い書き方
if command -v jq >/dev/null 2>&1; then
    echo "jq is installed"
else
    echo "jq is missing"
fi

type コマンド(シェル組み込み)

type はシェル組み込みで、エイリアス・関数・組み込み・外部コマンドを区別して教えてくれます。

$ type cd
cd is a shell builtin

$ type ll
ll is aliased to `ls -la'

$ type grep
grep is /usr/bin/grep

$ type -a python    # 全候補
python is /usr/local/bin/python
python is /usr/bin/python

whereis との違い

コマンド探す対象
whichPATH 上の実行ファイルのみ
whereisバイナリ + マニュアル + ソースコード
typeエイリアス / 関数 / 組み込み / 外部の区別
command -vシェルで実行されるコマンドのパス・種類
$ whereis grep
grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz

$ which grep
/usr/bin/grep

実用パターン

意図しない版が呼ばれているか確認

$ which python
/usr/bin/python

$ python --version
Python 3.10.4

# 期待通りでない場合
$ which -a python
/opt/myapp/bin/python
/usr/bin/python
$ ls -la /opt/myapp/bin/python   # シンボリックリンクのリンク先を確認

シンボリックリンクを辿る

$ which node
/usr/local/bin/node

$ readlink -f $(which node)
/usr/local/n/versions/node/20.10.0/bin/node

readlink -f を組み合わせると、最終的な実体パスを解決できます。バージョン管理ツール(nvm / pyenv / asdf)使用時に有用です。

よくあるトラブル

症状原因と対処
which では出るが実行は別物シェル組み込み・エイリアス・関数が優先されている。type で確認
which しても何も出ないPATH に含まれていない / 実行権限がない。ls -la で確認、chmod +x 検討
意図しないバージョンPATH の順序問題。which -a で全候補を見る
スクリプトで which が失敗するwhich が PATH 上にない最小環境かも。command -v に置換

関連

  • コマンド一覧 — 親カテゴリ
  • type — シェル組み込みコマンド判定
  • command -v — POSIX 準拠の検索
  • whereis — バイナリ・マニュアル・ソース一括検索
  • PATH 環境変数 — 実行ファイル検索パス