前回、
内蔵コマンドは
type や declare というコマンドを使いました。これらは bash に含まれる内蔵(組み込み)コマンドです。「内蔵」というからには「外部」もあるのですが、ls や cat など、その他多くのコマンドが外部コマンドです。内蔵コマンドは
enable コマンドや help コマンド、man bash、man bash-builtins で確認することができます。
前回のコマンド検索では type を使いましたが、実際にコマンド検索でよく使われるのは which です。なぜ which ではなく type を使ったかというのは以下のスクリプトを実行してみてください。
このコマンドの結果は以下のようになります。
どちらも unset PATH した後にエラーが出ていますが、エラーの内容が異なります。type の方は「ls コマンドが見つからない」と出ていますが、which の方は「そのようなファイルやディレクトリはない」と出ています。これは which が外部コマンドなので unset PATH すると、コマンド名だけでは呼び出しができず、which を実行ができないからです。前回、type を使ったのはそのためです(which にすらパスが通ってない環境ではあまり意味がありませんが)。type は引数に指定されたコマンドがシェルのエイリアスや関数であればその内容を表示します(これはオプションによって変わります)が、which は外部コマンドのみを探すという違いもあります。
内蔵コマンドと外部コマンドの特徴
内蔵コマンドと外部コマンドの特徴を以下に挙げます。内蔵コマンドの特徴
- 外部コマンドより速い
PATHに依存しない- bash 独自のコマンドがあるため他のシェルで使えない可能性がある(例:ksh で
declareは使えない) - バージョンによって実装されていないコマンドやオプションがある(例:
readarrayなどは bash 3.2 では使えない)
外部コマンドの特徴
- 内蔵コマンドより遅い
PATHに依存する(※ファイル名のみで呼び出す場合)- バージョンやシェルの種類が異なっても同じ動作が期待できる(オプションの種類など)
速度の違い
以下は内蔵コマンドと外部コマンドの速度を比較するためのスクリプトです。 内蔵コマンドの方は0秒未満で終了していますが、外部コマンドの方は16秒近くかかりました。オプションの違い
Lesson 2 でecho を作ったスクリプトの話をしましたが、「意図しない結果が出力されている部分がある」と話したのを覚えているでしょうか?
すでにおわかりだと思いますが、スクリプト内にコメントとして書いていたものは外部コマンドの方の echo の書式です。内蔵の echo はロングオプション(--help や --version)を受け付けません。help echo と man echo で比較してみてください。
# 内蔵 echo の書式 echo [-neE] [arg ...] # 外部 echo の書式 echo [SHORT-OPTION]... [STRING]... echo LONG-OPTION
enable も使ったサンプルを置いておきますのでご自由にお試しください。
which の他に whereis というコマンドもありますのでそちらもチェックしてみてください。
0 コメント:
コメントを投稿