今回はコマンドの在り処を探る、つまり、コマンドのフルパスを表示するwhichコマンドについてまとめます。
この説明を行う前にまず、前提としてlinuxコマンドとはどのようなものかをまとめたいと思います。
linuxコマンドは一つ一つのコマンドが独立したプログラムです。
そして、そのプログラムが設置されたディレクトリのパスをPATH環境変数に定義します。
これにより、それぞれのlinuxコマンドをフルパス(例えば、/bin/mkdir)で指定しなくてもコマンド名(mkdir)だけで実行可能となるのです。
今使用しているサーバでどこにパスが通っているかは下記のコマンドで確認できます。
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hoge/bin
この例の結果からみると、「
:」(コロン)で区切られた下記の7つのディレクトリにパスが通っていることがわかります。
/usr/local/bin
/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/sbin
/home/hoge/bin
それでは、本題のwhichについて、
まず、whichとは、
$ man which
WHICH(1) WHICH(1
)
NAME
which - shows the full path of (shell) commands.
SYNOPSIS
which [options] [--] programname [...]
DESCRIPTION
Which takes one or more arguments. For each of its arguments
it prints to stdout the full path of the executables that
would have been executed when this argument had been entered
at the shell prompt. It does this by searching for an exe-
cutable or script in the directories listed in the environment
variable PATH using the same algorithm as bash(1).
This man page is generated from the file which.texinfo.
繰り返しになりますが、whichコマンドはコマンドのフルパスを表示するコマンドということがわかります。
それでは、使用してみます。
$ which touch
/bin/touch
実際に確認もできました。
$ ls /bin/touch
/bin/touch
なお、「It does this by searching for an exe-cutable or script in the directories listed in the environment variable PATH using the same algorithm as bash(1).」にもあるようにPATH環境変数の定義されたディレクトリが探索対象である点に注意が必要です。
いずれかのディレクトリにコマンドのプログラムファイルが設置されていたとしてもPATH環境変数でそのディレクトリのパスが定義されていなければwhichコマンドは有効ではないということです。
以上です!
【参考サイト】
『Linuxコマンドを勉強~find、locate、which、whereis、whatis~』
『which - コマンドのフルパスを表示 - Linuxコマンド』
『linux コマンド which・whereis プログラムのパスを表示』
『探し物は何ですか?(Linuxコマンドパス検索「which」他編)』
『パス(PATH)の確認と設定方法は?』