【Linux】whichコマンドで実行ファイルのフルパスを確認する

目次

概要

実行しようとしているコマンドが、システム上の「どこにあるファイルなのか(フルパス)」を表示するコマンドです。

同じ名前のコマンドが複数インストールされている場合に、実際に実行されるのがどれかを確認したり、スクリプト内で絶対パスを指定するために場所を特定したりする際に使用します。

環境変数 PATH に設定されているディレクトリのみを検索対象とします。

仕様(引数・オプション)

構文

which [オプション] コマンド名

主な引数・オプション

オプション説明
-a検索パスの中で見つかったすべての実行可能ファイルを表示します(all)。通常は最初に見つかった1つだけを表示します。

基本の使い方

コマンド名を引数に渡すと、そのコマンドの絶対パスが表示されます。

コマンド

# python3 コマンドがどこにあるか確認
which python3

実行結果

/usr/bin/python3

実践コマンド

重複してインストールされているコマンドをすべて探す

開発環境などで、システム標準のバージョンと、ユーザーがインストールしたバージョン(pyenvやnvm等)が混在している場合、-a オプションですべての場所を洗い出せます。

# インストールされているすべての php コマンドを表示
which -a php
/usr/local/bin/php
/usr/bin/php

※ 上に表示されるものが、現在優先して実行されるコマンドです。

管理者用コマンドのパスを調べる

一般ユーザーの PATH には含まれていないが、管理者(root)の PATH/sbin/usr/sbin など)に含まれているコマンドを探す場合、sudo を経由して実行します。

# 一般ユーザーでは見つからないコマンドを探す
which useradd
# (出力なし、またはエラー)

# sudo経由でrootのPATHを使って探す
sudo which useradd
/usr/sbin/useradd

カスタムポイント

  • エイリアスの回避: 環境によっては which ls を実行すると、エイリアス設定(例: ls --color=auto)が表示されることがあります。純粋なパスだけを知りたい場合は、--skip-alias オプション(実装による)を使うか、後述の type コマンドを使用します。
  • 終了ステータス: コマンドが見つかれば 0、見つからなければ 1 を返します。これを利用してシェルスクリプトの条件分岐(if which docker > /dev/null; then ...)に使えます。

注意点

  1. PATH外は検索しない:which はあくまで環境変数 PATH に登録されたディレクトリ内しか見ません。カレントディレクトリにあってもPATHが通っていなければ表示されません。ファイルシステム全体から探したい場合は find や locate を使用してください。
  2. シェル組み込みコマンド:cd や echo などのシェル組み込みコマンド(ビルトイン)は、実体ファイルが存在しない場合があるため、which では正しく探せないか、/usr/bin/cd のような外部コマンド版が表示されることがあります。正確な種類を知るには type コマンドが推奨されます。
  3. ディストリビューションごとの違い:which コマンドはディストリビューションによって実装が異なる場合があり、オプションの挙動に差異が出やすいコマンドです。

応用

コマンドが所属するパッケージを特定する

which で取得したパスを引数として渡し、そのコマンドがどのパッケージ(RPMやDeb)によってインストールされたかを逆引きします。コマンド置換 $(...) を利用します。

RPM系(CentOS, RHEL, Fedora等)の場合:

# httpd コマンドがどのRPMパッケージに含まれるか調べる
rpm -qf $(which httpd)
httpd-2.4.57-1.el9.x86_64

Debian系(Ubuntu, Debian等)の場合:

# git コマンドがどのdebパッケージに含まれるか調べる
dpkg -S $(which git)
git: /usr/bin/git

まとめ

whichコマンドは、コマンド実行時の「実体」を把握するための基本ツールです。「コマンドが見つかりません(command not found)」というエラーが出た際に、本当にインストールされていないのか、単にPATHが通っていないだけなのかを切り分けるために真っ先に実行すべきコマンドです。ただし、シェル組み込みコマンドやエイリアスの確認には type コマンドの方が適している場合もあるため、用途に応じて使い分けることが重要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次