Linux / コマンド / type - コマンドの種類と実行対象の確認

typeは、Bashが入力されたコマンド名をエイリアス、予約語、関数、組み込みコマンド、または実行ファイルのどれとして解釈するかを表示する組み込みコマンドです。同じ名前が複数の形式で存在する場合や、予期しないプログラムが実行されるときの原因を調べるのに役立ちます。

whichが主にPATHで実行ファイルを探すことに焦点を当てているのに対して、typeは現在のシェルのエイリアスや関数まで含めた実際のコマンド解釈を説明します。Bash環境を診断する際に最初に使用するのに適したコマンドです。

typeコマンドとは?

シェルはコマンド名を実行する前に、エイリアス、関数、組み込みコマンドおよびPATHの実行ファイルなどを一定の規則に従って検索します。typeは、現在のBashがその名前をどの種類と判断し、何を実行するかを教えてくれます。

type自体もBashの組み込みコマンドです。他のシェルにも似たコマンドはありますが、オプションや出力形式は異なる場合があるため、本記事の例はBashを基準としています。

基本構文と結果の種類

type [-afptP] [名前...]

1つ以上のコマンド名を指定することができます。

type ls
type cd
type if
type printf

基本出力は人間が読みやすい文章です。環境設定によって次のような種類が出てくることがあります。

種類 意味
alias コマンドの読み取り時に別の文字列へ展開されるシェルの別名です。
keyword if、for のようなシェル予約語です。
function 現在のシェルに定義されている関数です。
builtin Bash 自体に含まれる組み込みコマンドです。
file PATH 検索で見つけた外部実行ファイルです。

同じ名前のすべての候補を確認する

-a はエイリアス、関数、組み込みコマンドおよび PATH で見つけられる実行ファイルを含め、名前に一致するすべての場所を出力します。

type -a printf
type -a test
type -a ls

printfは、Bashの組み込みコマンドと外部実行ファイルが共存することがあります。基本的にtype printfは実際に最初に選ばれる項目のみを表示しますが、-aは後ろに隠れた候補まで調べるときに便利です。

出力形式を選択するオプション

種類のみを出力する -t

-tは、説明文の代わりにalias、keyword、function、builtin、fileのいずれかを出力します。名前を見つけられない場合は、何も出力せず失敗状態を返します。

type -t cd
type -t if
type -t ls

実行ファイルのパスを出力する -p と -P

-pは、その名前が外部ファイルとして解釈される場合に実行ファイルのパスを出力します。エイリアス、関数、または組み込みコマンドが先に選ばれると、出力されないことがあります。たとえば type -p cd は、組み込みコマンドを見つけてもパスを表示せず、終了状態は成功になる場合があります。空の出力だけでコマンドがないと判断しないでください。これらの検索オプションは、実際のコマンド実行の優先順位を変更しません。

type -p ls
type -p cd

-Pは、現在の名前がエイリアスや組み込みコマンドであってもPATH検索を強制して実行ファイル候補を探します。

type -P printf
type -P test

Bashが記憶したハッシュパスがある場合、-pと-Pは現在のPATHの最初の項目とは異なる保存されたパスを示すことがあります。怪しい場合はhash -rでハッシュを消去してから再度確認してください。

typeオプションの整理

オプション 説明
-a 名前と一致するすべての候補を出力します。
-f 関数検索を省略します。-aと組み合わせて他の候補を調べることもできます。単独でも関数を候補から除外します。
-p デフォルトの解釈結果が外部実行ファイルの場合はパスを出力します。
-P 名前が他の種類として解釈されてもPATHで実行ファイルを探します。
-t コマンドの種類を一語で出力します。

エイリアスや関数によりコマンドが異なる場合

エイリアスの確認

対話型シェルでは、よく使うオプションがエイリアスに含まれることがあります。

type ls
alias ls

エイリアスを適用せずに元の名前を実行するには、状況に応じてバックスラッシュまたは絶対パスを使用することができます。ただし、バックスラッシュで避けられるのはエイリアス展開であり、同じ名前の関数までは無効にしません。絶対パスは、実際に存在する実行ファイルの場所を確認してから使います。

\ls
/usr/bin/ls

関数定義の確認

以下の deploy は、自分の現在のシェルに定義した関数の例です。そのような関数も実行ファイルもない環境では、見つからないという結果になります。

シェル関数が外部コマンドと同じ名前で定義されている場合、関数が先に実行されることがあります。type 基本出力には関数定義が表示されることがあります。

type deploy
type -t deploy

関数内で同じ名前の外部コマンドを呼び出す必要がある場合、command 名前 を使用して関数の検索をスキップすることができます。

type, command -v, which の比較

方法 特徴
type 名前 Bashでは、エイリアス、予約語、関数、組み込みコマンド、ファイルについて詳しく説明します。
type -a 名前 同じ名前で見つかるすべての候補を確認します。
command -v 名前 シェルスクリプトでコマンドの存在有無と解釈結果を確認するのに比較的移植性が高いです。
which 名前 実装によって主にPATHの実行ファイルを探し、シェル関数やエイリアスを正確に反映できない場合があります。

Bashで対話的な診断を行うときはtype、POSIXシェルスクリプトでコマンドの存在有無をチェックするときはcommand -vが一般的に適しています。

シェルスクリプトで安全に使用する

コマンドの種類に応じて分岐する

kind=$(type -t "$1") || {
  printf 'コマンドが見つかりませんでした: %s\n' "$1" >&2
  exit 1
}

case $kind in
  alias|function|builtin|file|keyword)
    printf '%s: %s\n' "$1" "$kind"
    ;;
esac

上のコードを identify-command.sh として保存し、bash identify-command.sh printf のように調べる名前を最初の引数として渡します。典型的な Bash では printf: builtin が表示され、存在しない名前ではメッセージを出して終了状態 1 になります。この例はBashのtype -t出力に依存しているため、スクリプトの解釈器がBashであることを確認する必要があります。

出力文の代わりに終了ステータスを使用する

基本出力はバージョンやロケールによって異なる場合があります。コマンドの存在だけを確認する場合は、結果文字列を解析せずに終了ステータスを確認してください。

if type git >/dev/null 2>&1; then
  printf '%s\n' 'gitを使用することができます.'
fi

よくある質問

type -p は何も出力しません

その名前がエイリアス、関数、または組み込みコマンドとして先に解釈されるか、外部実行ファイルが存在しない可能性があります。type -a 名前 で全候補を確認し、外部ファイルのみを強制的に探したい場合は type -P 名前 を使用してください。

PATH を変更したのに以前のパスが表示されます

Bash のハッシュテーブルに以前の実行パスが残っている可能性があります。現在のハッシュを確認し、必要に応じてクリアしてから再度検索してください。

hash
hash -r
type -P コマンド

スクリプトではエイリアスが見えません

非対話型 Bash では、デフォルトでエイリアス展開が有効になっていません。対話型シェルとスクリプトのコマンド解釈結果は異なる場合があるため、自動化ではエイリアスに依存しない方が良いです。

type は実行ファイルの場所だけを探すコマンドですか?

いいえ。現在、Bashが名前をどのように解釈するかを示し、エイリアス、予約語、関数、および組み込みコマンドも区別します。

type -aの出力順序は実行の優先順位ですか?

最初の項目は一般的に現在のシェルで選択される対象を理解するのに役立ちます。ただし、ハッシュ、シェルオプション、および実行コンテキストが影響するため、重要な作業では実際の環境を確認してください。

他のシェルでもオプションは同じですか?

必ずしもそうとは限りません。この文書のオプションはBash基準です。Zsh、Dashなどでは、該当シェルのヘルプを確認してください。

まとめ

typeは、同じ名前のエイリアス、関数、組み込みコマンド、および実行ファイルを区別し、実際のコマンド解釈を診断するツールです。基本出力で説明を読み、-aで全候補を検索し、-tで種類のみ取得し、-Pで外部実行ファイルを強制的に検索できます。

コマンドが予期と異なる動作をするときは、type -a 名前から実行してみてください。他の基本コマンドはLinuxコマンド一覧と概要で確認できます。

公式文書を参照