Bashでprintfという名前が、シェル組み込みと外部コマンドの両方として利用できる。
実行せずに、Bashが認識する候補を解決順にすべて表示する。
適切なコマンドはどれか。
Bashのtypeは、名前が組み込み、関数、エイリアス、外部ファイルのどれとして解決されるかを調べる。-aを付けると全候補を表示する。
詳細解説
which printfwhichは通常PATH上の実行ファイルを探し、Bash組み込みを含む全候補の確認には適さない。
誤りです。whichは通常、PATH上でprintfという実行ファイルを検索します。
Bashの組み込みや関数を含む全候補と解決順を調べる要件には不十分です。
command -v printfBashが実行に使う1つの解決結果は分かるが、全候補を列挙しない。
誤りです。command -vはBashが実際に選ぶ解決結果を確認するのに適します。
ただし全候補を列挙する-a相当の指定ではなく、外部printfまで並べません。
whereis printfバイナリやマニュアルの所在を探すコマンドで、Bashの組み込み解決順を示さない。
誤りです。whereisはバイナリ、ソース、マニュアルなどの所在を探します。
Bashの組み込みコマンドという分類やシェル内の解決順位は対象外です。
type -a printftypeはBashにおける名前の種類を調べ、-aで同名の全候補を表示する。
正しい選択肢です。typeはBashの組み込みとして名前の種類を調べます。
-aを付けることで最初の候補だけでなく、PATH上の同名外部コマンドも含めて表示します。
実際に確かめる
一時的な検証環境で実行できる例です。
type -a printf
command -v printf期待される結果
type -a: printf is a shell builtin と外部printfのパス
command -v: printf
※文言と外部コマンドのパスは環境により異なる理解のポイント
- typeはBash自身の名前解決を調べる
- -aは全候補を表示する
- command -vは実行対象となる1候補を示す
確認時の注意
- 確認環境: Bash 5.2 / GNU coreutils 9.x
- 外部printfがない環境では候補数が異なります。
- この問題はBashを前提とします。
基礎のおさらい
名前解決の種類
Bashはエイリアス、関数、組み込み、PATH上の実行ファイルなどを解決します。単にファイルを探すだけではありません。
組み込みの必要性
cdのように現在のシェル状態を変える操作は、外部プロセスだけでは実現できないため組み込みとして提供されます。
移植性
whichの動作や実装は環境差があります。シェルの解決を調べる場合は、そのシェルが提供するtypeやcommand -vが適します。