このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:コマンドのフルパスを表示する:whichコマンド

 Linuxシステムでコマンドを実行する際、実際にそのコマンドがどこに存在しているのかを知りたいことがあります。特に、同じ名前のコマンドが複数のディレクトリに存在する場合や、コマンドが正しくインストールされているか確認したい場合などです。

 このようなときに役立つのが which コマンドです。which コマンドを使用することで、指定したコマンドのフルパス(絶対パス)を表示することができます。ここでは、which コマンドの使い方とその仕組みについて詳しく解説します。

シェルがコマンドを探す仕組み

 Linuxのコマンドは、ディレクトリツリーのどこかにファイルとして存在しています。たとえば、cat コマンドは /usr/bin ディレクトリにある /usr/bin/cat という実行ファイルです。

例:cat コマンドの場所を確認

user01@ubuntu:~$ ls -lF /usr/bin/cat
-rwxr-xr-x 1 root root 39384  4月  5  2024 /bin/cat*

 しかし、通常はコマンドを実行する際に /usr/bin/cat とフルパスを入力する必要はなく、単に cat と入力するだけで実行できます。これは、シェルがコマンドを探す際に、$PATH 環境変数に設定された場所から自動的にコマンドを検索してくれるためです。

$PATH の確認

シェルがコマンドを探す場所や順序は、$PATH 環境変数で確認できます。

user01@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  • この表示は、コマンドを探すディレクトリをコロン(:)で区切ったものです。
  • サーチパス(または単にパス)と呼ばれます。

コマンドを探す流れ

たとえば、cat コマンドを実行しようとすると、シェルは以下の順序でディレクトリを検索します。

  1. /usr/local/sbin/cat見つからない
  2. /usr/local/bin/cat見つからない
  3. /usr/sbin/cat見つからない
  4. /usr/bin/cat見つかった!
実行例

コマンドが見つかると以下のようにコマンドが実行されます。

user01@ubuntu:~$ cat
hello
hello # Ctrl + D を入力
  • cat コマンドが /usr/bin/cat で見つかったため、コマンドが実行されています。
  • Ctrl + D を入力すると、cat コマンドが終了します。

which コマンドの使い方

シェルが実際にどのファイルを実行しているのかを確認したい場合、which コマンドを使用します。

【書式】
which [オプション] <コマンド名>

例:cat コマンドのフルパスを表示
user01@ubuntu:~$ which cat
/usr/bin/cat

 which コマンドは、指定されたコマンド名を $PATH で設定されたサーチパスから探し、最初に見つかった実行ファイルのフルパスを表示します。

複数の同名コマンドがある場合

 同じ名前のコマンドが複数のディレクトリに存在する場合、which コマンドはデフォルトでは最初に見つかったパスのみを表示します。しかし、-a オプションを使用すると、サーチパス内のすべての同名コマンドのパスを表示できます。

例:cat コマンドのすべてのパスを表示
user01@ubuntu:~$ which -a cat
/usr/bin/cat
/bin/cat

 この結果から、cat コマンドが /usr/bin/cat/bin/cat の2か所に存在することがわかります。

まとめ

  • シェルは $PATH 環境変数に設定されたディレクトリを順に検索してコマンドを探します。
  • $PATH はコロン(:)で区切られたディレクトリのリストであり、これをサーチパスと呼びます。
  • which コマンドを使用すると、指定したコマンドの実行ファイルがどこにあるかを確認できます。
  • 基本書式which コマンド名
  • すべてのパスを表示which -a コマンド名
  • コマンドの実行ファイルの場所を確認することで、正しいコマンドが実行されているか、または複数のバージョンが存在する場合にどのバージョンが使用されているかを把握できます。

 which コマンドを活用して、システムのコマンド管理やトラブルシューティングに役立ててください。