コマンドの実体を確認したい

シェルで実行するコマンドには、シェル自身が持つビルトインコマンド、エイリアス、PATH上の実行ファイルなど複数の種類がある。あるコマンド名が実際にはどれに該当するかを確認したい場合、typeコマンドを使う。

type でコマンドの種類を確認する

typeにコマンド名を渡すと、そのコマンドの種類と実体を表示する。

シェルのビルトインコマンドの場合は以下のように表示される。

$ type cd
cd is a shell builtin

エイリアスの場合は、展開後の内容も合わせて表示される。

$ alias ll="ls -la"
$ type ll
ll is aliased to `ls -la'

PATH上の実行ファイルの場合は、実際のパスを表示する。

$ type ls
ls is /usr/bin/ls

シェルの予約語(キーワード)の場合は以下のように表示される。

$ type if
if is a shell keyword

type -a で該当する全ての実体を表示する

エイリアスとPATH上の実行ファイルで同名のコマンドが存在する場合、typeだけでは優先される1つしか表示されない。-aオプションを使用すると、該当する実体を全て表示できる。

$ alias ls="ls --color=auto"
$ type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
ls is /bin/ls

エイリアスのls/usr/bin/ls/bin/lsのすべてが表示されている。実際にコマンドを実行すると、このうち一番上のエイリアスが優先して使われる。

type -t で種類のみを取得する

-tオプションを使用すると、種類の文言(aliaskeywordfunctionbuiltinfileのいずれか)だけを取得できる。スクリプトの条件分岐で使う場合に便利。

$ type -t cd
builtin

$ type -t ls
alias

$ type -t if
keyword

which との違い

似たコマンドにwhichがあるが、whichはPATH上の実行ファイルしか探せず、ビルトインコマンドやエイリアス、シェル関数は判定できない。ビルトインコマンドやエイリアスも含めて判定したい場合はtypeを使うとよい。