Linuxでコマンドを打ったとき、「このコマンドってどこにあるの?」「本当にインストールされてる?」と思ったことはありませんか?
そんなときに役立つのが、which
コマンドです。このコマンドを使えば、シェルが実行するコマンドの絶対パスを確認できるので、環境トラブルやコマンドの競合調査にも使えます。
この記事では、which
の基本的な使い方から、似たコマンドとの違い、実務での活用例まで、わかりやすく解説します。
whichコマンドとは?どんなときに使うの?

whichの基本的な役割
which
は、指定したコマンドが「シェルのPATH環境変数に従ってどこに存在するか」を表示するコマンドです。
つまり、実際に実行されるコマンドファイルの場所を教えてくれます。
基本構文
which コマンド名
どんな場面で使うの?
- コマンドの場所を確認したいとき
インストールされているプログラムの実際の場所を知りたい場合 - 複数バージョンが共存しているとき
PythonやNodejs など、複数バージョンがある場合にどれが実行されるか調べたい場合 - 環境変数PATHのトラブル調査
コマンドが見つからないエラーの原因を調べたい場合 - スクリプト作成時の確認
シェルスクリプトで特定のコマンドを使う前に、存在を確認したい場合
PATH環境変数との関係
# 現在のPATH設定を確認
echo $PATH
# 結果例: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
# whichはこのPATHの順番に従って検索する
which python3
# 結果例: /usr/local/bin/python3
ポイント: whichは「どのコマンドが実行されているかを確認するための道具」です。
whichコマンドの基本的な使い方と例

その1:基本的な使い方
which ls
実行結果例:
/bin/ls
説明: ls
コマンドは/bin
ディレクトリにあることがわかります。
その2:複数のコマンドを同時に確認
which ls grep awk cat
実行結果例:
/bin/ls
/usr/bin/grep
/usr/bin/awk
/bin/cat
説明: 複数のコマンドを一度に確認できるので効率的です。
その3:存在しないコマンドを調べる
which hogehoge
実行結果: 何も表示されず、終了ステータスが1になります。
確認方法:
which hogehoge
echo $? # 終了ステータスを確認
# 結果: 1(見つからない場合)
which ls
echo $? # 終了ステータスを確認
# 結果: 0(見つかった場合)
その4:スクリプトでの活用
# コマンドの存在確認
if which curl > /dev/null 2>&1; then
echo "curlがインストールされています"
else
echo "curlがインストールされていません"
fi
# コマンドのフルパスを変数に格納
CURL_PATH=$(which curl)
echo "curlの場所: $CURL_PATH"
その5:パイプとの組み合わせ
# 複数のコマンドの場所をファイルに保存
which ls cp mv rm > command_paths.txt
# 特定のディレクトリにあるコマンドだけを表示
which python python3 pip | grep "/usr/local"
その6:エラーハンドリング付きの使用例
#!/bin/bash
REQUIRED_COMMANDS="git docker node npm"
for cmd in $REQUIRED_COMMANDS; do
if ! which "$cmd" > /dev/null 2>&1; then
echo "エラー: $cmd が見つかりません"
exit 1
else
echo "$cmd: $(which "$cmd")"
fi
done
echo "すべての必要なコマンドが利用可能です"
覚えておこう: whichは使い方がシンプルで、日常的に頻繁に使うことができる便利コマンドです。
「which」と似たコマンドとの違い

コマンド比較表
コマンド | 目的 | 表示内容 | 特徴 |
---|---|---|---|
which | 実行されるコマンドのパス表示 | /usr/bin/ls | PATH内の最初に見つかるもの |
whereis | バイナリ・マニュアル・ソースの場所表示 | ls: /bin/ls /usr/share/man/man1/ls.1.gz | 関連ファイルも含めて検索 |
type | シェルがコマンドをどう解釈するか表示 | ls is aliased to 'ls --color=auto' | エイリアス・関数・組み込みも判別 |
command -v | POSIX準拠でコマンドパス取得 | /usr/bin/ls | スクリプトで推奨 |
実際の使用例比較
# which: シンプルにパスだけ表示
which ls
# /bin/ls
# whereis: 関連ファイルも含めて表示
whereis ls
# ls: /bin/ls /usr/share/man/man1/ls.1.gz
# type: 詳細な情報を表示
type ls
# ls is aliased to `ls --color=auto`
# command -v: POSIX準拠
command -v ls
# /bin/ls
エイリアスがある場合の違い
# エイリアスを設定
alias ll='ls -la'
# which: エイリアスは検出されない
which ll
# (何も表示されない)
# type: エイリアスを正しく検出
type ll
# ll is aliased to `ls -la'
# whereis: 実際のファイルを検索
whereis ll
# ll:(何も表示されない、実ファイルが存在しないため)
組み込みコマンドの場合
# cd は組み込みコマンド
which cd
# (何も表示されない)
type cd
# cd is a shell builtin
command -v cd
# cd
使い分けの指針
whichを使う場面:
- 単純にコマンドの場所を知りたい
- スクリプトで存在確認をしたい
- 手軽に確認したい
typeを使う場面:
- エイリアスや関数も含めて調べたい
- シェルがどう解釈するかを詳しく知りたい
- より詳細な情報が必要
command -vを使う場面:
- POSIX準拠のスクリプトを書く
- 移植性を重視する
whereisを使う場面:
- マニュアルページの場所も知りたい
- 関連ファイルをまとめて確認したい
whichが使えない場合の対処法とインストール方法

whichコマンドがない場合の症状
which ls
# bash: which: command not found
一部の軽量Linux環境(Alpine Linux、最小構成のDockerコンテナなど)では、which
がインストールされていないことがあります。
ディストリビューション別インストール方法
Ubuntu / Debian系
# パッケージ情報の更新
sudo apt update
# debianutilsパッケージのインストール
sudo apt install debianutils
注意: 通常はデフォルトでインストール済みです。
CentOS / RHEL / Rocky Linux / AlmaLinux
# CentOS 7以前
sudo yum install which
# CentOS 8以降、Rocky Linux、AlmaLinux
sudo dnf install which
Fedora
sudo dnf install which
Alpine Linux
# Alpine Linuxでのインストール
sudo apk add which
特徴: Alpine Linuxは軽量化のため、標準ではwhichが含まれていません。
Arch Linux
sudo pacman -S which
代替手段:whichが使えないときの対処法
その1:typeコマンドを使用
# typeは多くのシェルに組み込まれている
type ls
# ls is /bin/ls
# パスのみを取得
type -p ls
# /bin/ls
その2:command -vを使用(推奨)
# POSIX準拠で移植性が高い
command -v ls
# /bin/ls
# スクリプトでの使用例
if command -v git > /dev/null 2>&1; then
echo "gitが利用可能です"
else
echo "gitがインストールされていません"
fi
その3:手動でPATHを検索
# PATHを手動で検索する関数
find_command() {
local cmd="$1"
local IFS=":"
for dir in $PATH; do
if [ -x "$dir/$cmd" ]; then
echo "$dir/$cmd"
return 0
fi
done
return 1
}
# 使用例
find_command ls
# /bin/ls
Docker環境での対処例
# Alpine ベースのDockerfile
FROM alpine:latest
# whichをインストール
RUN apk add --no-cache which
# または、command -v を使用するスクリプトを作成
RUN echo '#!/bin/sh' > /usr/local/bin/which && \
echo 'command -v "$@"' >> /usr/local/bin/which && \
chmod +x /usr/local/bin/which
実践的な活用例
システム管理での活用
#!/bin/bash
# システムで使用可能なテキストエディタを確認
EDITORS="vim nano emacs joe"
echo "利用可能なテキストエディタ:"
for editor in $EDITORS; do
if which "$editor" > /dev/null 2>&1; then
echo " $editor: $(which "$editor")"
fi
done
開発環境の確認
#!/bin/bash
# 開発環境の確認スクリプト
echo "=== 開発環境確認 ==="
check_command() {
local cmd="$1"
local name="${2:-$cmd}"
if which "$cmd" > /dev/null 2>&1; then
local version_cmd="${3:-$cmd --version}"
local path=$(which "$cmd")
echo "✓ $name: $path"
if [ -n "$3" ]; then
echo " バージョン: $($version_cmd 2>/dev/null | head -1)"
fi
else
echo "✗ $name: インストールされていません"
fi
}
check_command "git" "Git" "git --version"
check_command "node" "Node.js" "node --version"
check_command "npm" "npm" "npm --version"
check_command "python3" "Python 3" "python3 --version"
check_command "docker" "Docker" "docker --version"
複数バージョン管理の確認
# Python のバージョン確認
echo "Pythonの確認:"
for python_cmd in python python2 python3 python3.8 python3.9 python3.10; do
if which "$python_cmd" > /dev/null 2>&1; then
path=$(which "$python_cmd")
version=$("$python_cmd" --version 2>&1)
echo " $python_cmd: $path ($version)"
fi
done
パッケージ管理での活用
#!/bin/bash
# 必要なツールの自動インストールチェック
REQUIRED_TOOLS="curl wget git unzip"
install_missing_tools() {
local missing_tools=""
for tool in $REQUIRED_TOOLS; do
if ! which "$tool" > /dev/null 2>&1; then
missing_tools="$missing_tools $tool"
fi
done
if [ -n "$missing_tools" ]; then
echo "以下のツールがインストールされていません:$missing_tools"
echo "インストールしますか? (y/n)"
read -r answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
sudo apt update && sudo apt install -y $missing_tools
fi
else
echo "すべての必要なツールがインストールされています"
fi
}
install_missing_tools
よくある質問と答え

Q: whichとtypeはどちらを使うべきですか? A: 単純にコマンドの場所を知りたいならwhich
、エイリアスや関数も含めて調べたいならtype
を使用してください。
Q: whichコマンドが見つからない場合はどうしますか? A: command -v
やtype -p
を代替として使用できます。これらは多くの環境で利用可能です。
Q: whichの結果が期待と違う場合は? A: PATH環境変数の設定を確認してください。echo $PATH
で現在の設定を見ることができます。
Q: 複数のwhichがある場合はどうしますか? A: which -a
オプション(利用可能な場合)やtype -a
で、すべての候補を表示できます。
まとめ:whichコマンドでLinuxのコマンド管理をマスターしよう!
重要ポイントまとめ:
- whichはコマンドの実際の場所を確認する基本ツール
- 環境変数PATHに従って検索される
- スクリプトでの存在確認にも活用可能
- 代替手段として
command -v
やtype
も覚えておく
which
コマンドは、日常的に使うLinuxツールの中でも非常に基本かつ重要な存在です。特に複数バージョンの言語やツールがインストールされている環境では、**「どのコマンドが使われるか」**を確認するのに必須です。
基本的な使い方:
- 確認:
which コマンド名
- スクリプト活用:
CMD=$(which ...)
- トラブル時:
type
やcommand -v
で代用
ぜひこの記事を参考に、Linux操作の理解をさらに深めてください!
コメント