「同じ名前のコマンドが複数あって、どちらが実行されているのか分からない」
Linuxではコマンドを打つだけで実行できますが、実際のプログラムファイルがどこに置かれているかを意識する場面は意外と多いです。
この記事では、コマンドのフルパスを調べる
which コマンドの実践的な使い方を解説します。基本的な使い方から、
type や whereis との違い、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)
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
~/.bashrc や /etc/profile.d/ 配下のファイルに export PATH の行を追記してください。3. 一般ユーザーで管理コマンドを探している場合
/sbin や /usr/sbin にあるコマンド(fdisk、ip 等)は、一般ユーザーのPATHに含まれていない場合があります。sudo 付きで実行するか、フルパスで指定してください。本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| コマンドのフルパスを表示する | which コマンド名 |
| PATH上の全候補を表示する | which -a コマンド名 |
| エイリアスや組み込みも含めて確認する | type コマンド名 |
| マニュアルの場所も表示する | whereis コマンド名 |
| スクリプトでコマンドの有無を確認する | command -v コマンド名 |
コマンドの仕組みを理解して、現場で迷わないスキルを身につけませんか?
whichやPATHの仕組みを知っていると、コマンドが動かないトラブルにも冷静に対処できます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
