whichコマンドでコマンドの場所を調べる方法|type・whereisとの違いもコマンド


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドU-Z, ファイル・ディレクトリ管理コマンド > whichコマンドでコマンドの場所を調べる方法|type・whereisとの違いもコマンド
「このコマンド、どこにインストールされているんだろう?」
「同じ名前のコマンドが複数あって、どちらが実行されているのか分からない」
Linuxではコマンドを打つだけで実行できますが、実際のプログラムファイルがどこに置かれているかを意識する場面は意外と多いです。

この記事では、コマンドのフルパスを調べる which コマンドの実践的な使い方を解説します。
基本的な使い方から、typewhereis との違い、PATH環境変数との関係、シェルスクリプトでの活用まで網羅しました。

whichコマンドとは?PATH検索の仕組み

which は、指定したコマンドの実行ファイルがどのディレクトリにあるかを表示するコマンドです。

Linuxでコマンドを実行すると、シェルは環境変数 PATH に登録されたディレクトリを先頭から順番に検索し、最初に見つかった実行ファイルを起動します。which はこの検索と同じ動きをして、見つかったファイルのフルパスを表示します。

# PATHの中身を確認する $ echo /home/tomohiro/.local/bin:/home/tomohiro/.vscode-server/bin/07ff9d6178ede9a1bd12ad3399074d726ebe6e43/bin/remote-cli:/home/tomohiro/.local/bin:/home/tomohiro/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Users/Tomohiro/AppData/Local/Programs/Microsoft VS Code:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/ProgramData/chocolatey/bin:/mnt/c/Program Files (x86)/JustSystems/JSLIB32:/mnt/c/Program Files/dotnet/:/mnt/c/Program Files/Amazon/AWSCLIV2/:/mnt/c/Users/Tomohiro/AppData/Local/Programs/Python/Python311/Scripts/:/mnt/c/Users/Tomohiro/AppData/Local/Programs/Python/Python311/:/mnt/c/Users/Tomohiro/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/Tomohiro/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/Users/Tomohiro/AppData/Local/Python/bin:/mnt/c/Users/Tomohiro/AppData/Local/Microsoft/WinGet/Links:/snap/bin /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

つまり which は「PATHの中から、そのコマンドがどこにあるかを教えてくれるコマンド」です。

whichコマンドの基本的な使い方

1. コマンドのフルパスを表示する

最も基本的な使い方です。引数にコマンド名を指定するだけです。

# cpコマンドのパスを表示する $ which cp /usr/bin/cp # pythonのパスを表示する $ which python3 /usr/bin/python3

2. 複数のコマンドを一度に調べる

引数にコマンド名を複数並べると、まとめて確認できます。

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

3. which -a で全てのパスを表示する

PATHに同名のコマンドが複数存在する場合、which は最初に見つかったものだけを表示します。-a オプションを付けると、PATH上の全ての候補を表示できます。

# pythonの全パスを表示する $ which -a python3 /usr/local/bin/python3 /usr/bin/python3

この場合、実際に実行されるのは先に表示される /usr/local/bin/python3 です。「意図したバージョンが使われているか」を確認したいときに便利です。

which・type・whereisの違いと使い分け

コマンドの場所を調べる方法は which 以外にもあります。それぞれの違いを整理しておきましょう。

typeコマンド

type はシェルの組み込みコマンドで、コマンドの「種類」を教えてくれます。エイリアス、シェル組み込み、外部コマンドのどれかを判別できます。

# 外部コマンドの場合 $ type cp cp is /usr/bin/cp # エイリアスの場合 $ type ls ls is aliased to 'ls --color=auto' # シェル組み込みコマンドの場合 $ type cd cd is a shell builtin

which は外部コマンドしか検索できませんが、type はエイリアスやシェル組み込みコマンドも判別できます。

whereisコマンド

whereis はコマンドの実行ファイルに加え、マニュアルページやソースファイルの場所も表示します。

$ whereis cp cp: /usr/bin/cp /usr/share/man/man1/cp.1.gz

whereis はPATHではなく、あらかじめ決められたディレクトリ(/usr/bin、/usr/sbin等)を検索する点が which と異なります。

command -v(POSIX準拠)

シェルスクリプトでコマンドの存在を確認する場合は、command -v が推奨されます。which はディストリビューションによって挙動が異なる場合がありますが、command -v はPOSIX規格で定められており、どの環境でも同じ動作が保証されています。

# シェルスクリプトでのコマンド存在確認(推奨) if command -v python3 > /dev/null 2>&1; then echo "python3 が見つかりました" else echo "python3 がインストールされていません" fi

使い分けの目安

which:手軽にコマンドのパスを調べたいとき(対話的な操作向き)
type:エイリアスやシェル組み込みも含めて確認したいとき
whereis:マニュアルの場所も含めて調べたいとき
command -v:シェルスクリプトでコマンドの有無を確認するとき(POSIX準拠)

実務でのwhich活用Tips

1. 意図しないバージョンが実行されていないか確認する

サーバーに複数バージョンのPythonやJavaがインストールされている場合、which で実際に実行されるパスを確認しましょう。

# どのpythonが実行されるか確認する $ which python3 /usr/local/bin/python3 # バージョンも合わせて確認する $ python3 --version Python 3.11.5

2. コマンドがインストールされているか確認する

パッケージをインストールした後、コマンドが正しくPATHに配置されたかを確認するのに使います。

# nginxがインストールされているか確認する $ which nginx /usr/sbin/nginx

3. シェルスクリプトでコマンドのフルパスを使う

cronやsystemdから実行するスクリプトでは、PATHが通常と異なる場合があります。which で調べたフルパスを直接指定すると確実です。

# cronで実行するスクリプトではフルパス指定が安全 /usr/bin/python3 /home/user/scripts/backup.py

「which: no xxx in ...」エラーの対処法

which でコマンドが見つからない場合、以下のメッセージが表示されます。

$ which nginx /usr/bin/which: no nginx in (/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin)

これは「PATHに登録されたディレクトリの中に、そのコマンドが存在しない」という意味です。

1. コマンドがインストールされていない場合

そもそもインストールされていなければ見つかりません。パッケージマネージャで確認してください。

# RHEL系の場合 $ rpm -qa | grep nginx # または dnf で確認 $ dnf list installed | grep nginx

2. PATHが通っていない場合

コマンドはインストールされているが、そのディレクトリがPATHに含まれていないケースです。

# findで実行ファイルを探す $ find / -name nginx -type f 2>/dev/null /usr/local/nginx/sbin/nginx # PATHに追加する(一時的) $ export PATH=/home/tomohiro/.local/bin:/home/tomohiro/.vscode-server/bin/07ff9d6178ede9a1bd12ad3399074d726ebe6e43/bin/remote-cli:/home/tomohiro/.local/bin:/home/tomohiro/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Users/Tomohiro/AppData/Local/Programs/Microsoft VS Code:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/ProgramData/chocolatey/bin:/mnt/c/Program Files (x86)/JustSystems/JSLIB32:/mnt/c/Program Files/dotnet/:/mnt/c/Program Files/Amazon/AWSCLIV2/:/mnt/c/Users/Tomohiro/AppData/Local/Programs/Python/Python311/Scripts/:/mnt/c/Users/Tomohiro/AppData/Local/Programs/Python/Python311/:/mnt/c/Users/Tomohiro/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/Tomohiro/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/Users/Tomohiro/AppData/Local/Python/bin:/mnt/c/Users/Tomohiro/AppData/Local/Microsoft/WinGet/Links:/snap/bin:/usr/local/nginx/sbin

永続的にPATHを追加したい場合は、~/.bashrc/etc/profile.d/ 配下のファイルに export PATH の行を追記してください。

3. 一般ユーザーで管理コマンドを探している場合

/sbin/usr/sbin にあるコマンド(fdiskip 等)は、一般ユーザーのPATHに含まれていない場合があります。sudo 付きで実行するか、フルパスで指定してください。

本記事のまとめ

やりたいこと コマンド
コマンドのフルパスを表示する which コマンド名
PATH上の全候補を表示する which -a コマンド名
エイリアスや組み込みも含めて確認する type コマンド名
マニュアルの場所も表示する whereis コマンド名
スクリプトでコマンドの有無を確認する command -v コマンド名

コマンドの仕組みを理解して、現場で迷わないスキルを身につけませんか?

whichやPATHの仕組みを知っていると、コマンドが動かないトラブルにも冷静に対処できます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る