web-dev-qa-db-ja.com

組み込みコマンドとそうでないコマンドの違いは何ですか?

組み込みコマンドと名目上同じことを実行できる別のコマンドの間に本質的な違いはありますか?

例えば。ビルトインは「特別な」扱いを受けますか? ...それらを実行するオーバーヘッドが少ないですか? ..または、単に「組み込まれている」だけですか。あなたの車のダッシュボードのように?

...そして、これらのビルトインの決定的な(現在の)リストはありますか?

72
Peter.O

あなたのコメントから、あなたはShellが正確に何であるかについて混乱しているようです。カーネルはシステムの管理を担当します。実際にプログラムのロードと実行、ファイルへのアクセス、メモリの割り当てなどを行う部分です。しかし、カーネルにはユーザーインターフェイスがありません。仲介者として別のプログラムを使用することによってのみ、それと通信できます。

シェルは、プロンプトを出力し、ユーザーからの入力行を読み取り、ファイルを操作したり他のプログラムを実行したりするための1つまたは複数のコマンドとして解釈するプログラムです。 GUIが発明される前は、シェルはOSの主要なユーザーインターフェイスでした。 MS-DOSでは、シェルはcommand.comそして、これまでに別のものを使用しようとした人はほとんどいません。ただし、Unixでは長い間、ユーザーが選択できる 複数のシェル がありました。

それらは3つのタイプに分けることができます。 Bourne互換シェルは、元の Bourne Shell から派生した構文を使用します。 Cシェルは、元の Cシェル の構文を使用します。次に、独自の構文を発明したり、一部のプログラミング言語から1つを借りたりする非伝統的なシェルがあり、一般に最初の2つのタイプよりもはるかに人気がありません。

組み込みコマンドは、シェルが他のプログラムをロードして実行する要求として解釈するのではなく、シェルが実行するコマンドです。これには2つの主な効果があります。まず、プログラムの読み込みと実行には時間がかかるため、通常は高速です。もちろん、コマンドの実行に時間がかかるほど、全体の実行時間と比較して、読み込み時間の重要性は低くなります(読み込み時間がかなり一定であるため)。

次に、組み込みコマンドがシェルの内部状態に影響を与える可能性があります。外部プログラムはシェルの現在のディレクトリを変更できないため、cdのようなコマンドを組み込む必要があるのはそのためです。 echoのような他のコマンドは、効率化のために組み込まれている場合がありますが、それらが外部コマンドになれない本質的な理由はありません。

組み込まれているコマンドは、使用しているシェルによって異なります。リストについては、そのドキュメントを参照する必要があります(たとえば、bashの組み込みコマンドは マニュアルの第4章 にリストされています)。 POSIXではtypeが組み込みである必要があるため、typeコマンドはコマンドが組み込みかどうかを示します(シェルがPOSIX互換の場合)。 whichがシェルの組み込みではない場合、おそらくシェルの組み込みを認識せず、外部プログラムを探します。

90
cjm

組み込みユーティリティには3つのレベルがあります。

  • 一部のユーティリティ は、実際にはプログラミング言語としてシェルの一部ですが、 予約語 ではありません。これらは、制御フローユーティリティ(_._、_:_、breakcontinuereturntrapexitexeceval)、パラメータ関連ユーティリティ(setunsetshiftexportreadonlylocal¹ありますtypeset¹)、エイリアスユーティリティ(alias²、unalias²)およびtimes³。これら 特別な組み込み は特別な扱いを受けます:

    • 間違った引数を特別な組み込みに渡すと、エラーメッセージを表示した後で次のコマンドにスキップするのではなく、シェル自体が異常終了する場合があります。
    • 割り当て前の構文_foo=bar utility_には別の意味があります。これは、ユーティリティの期間のみ環境に割り当てるのではなく、通常のパラメーター割り当て(つまり、_foo=bar; utility_と同等)です。
  • 一部のユーティリティneedは、シェルの内部設定で動作するため、シェル内に実装する必要があります。これも:

    • シェルの現在のディレクトリに作用するユーティリティ(cddirspushdpopdなど)。
    • bgdisownfgjobswaitなどのジョブ制御ユーティリティ。
    • builtincommandhashreadtypeulimitumaskなどの他のシェル属性を読み取りまたは操作するユーティリティ。
    • fchistorybindなどのインタラクティブ機能に関連するユーティリティ。
  • 一部のユーティリティは通常、純粋にパフォーマンスの組み込みとして実装されます:echoprintftesttruefalse

bashksh 、および zsh などの高度なシェルには、通常、より多くの組み込み機能があり、非標準機能を実装することがよくあります(通常は対話用)。各シェルのマニュアルには、どのコマンドが組み込みであるかが記載されていますが、一部のシェル( zsh 、少なくとも)は、より多くの組み込みを提供できる動的にロード可能なモジュールをサポートしています。

¹ POSIXには不明ですが、kshおよびその他のいくつかのシェルでは特別です。
² POSIXでは通常ですが、kshおよびその他のいくつかのシェルでは特別です。
³ kshでは、timestime キーワードのラッパーです。これは_{ { time;} 2>&1;}_のエイリアスです。 POSIXでは、timeを、通常の解析またはパイプライン全体(ksh、zshのbash)に適用されるキーワードを持つ外部ユーティリティにすることができます。

組み込みは、外部プログラムではなく、シェルによって提供されるコマンドです。 bash 's builtins (bashのmanページにもリストされています)と zsh' s builtins のリストを次に示します。 kshは、builtinを実行してリストを提供します。

特定のコマンドが組み込みかどうかを確認するには、type commandを実行します。これを確認するには、type fortype lsを試してください。

10
Shawn J. Goff

すべてのディストリビューションとシェルには、組み込みのシェル関数とは異なるコマンドのコレクションがあります。一般的には、シェルは、時間、速度を節約し、残りの機能セットと統合するための最も一般的で単純な関数をシェルに組み込んでいるというものです。別のシステムプロセスを起動する必要がないため、オーバーヘッドははるかに低くなります。ただし、組み合わせることができます。何かのビルトインがあるシェルを実行するかもしれませんが、システムにもそのコマンドがあります。通常、組み込みが優先されますが、それを制御できます。

特定のコマンドが組み込みコマンドであるかどうかは、type mycommandを実行することで簡単に確認できます。ほとんどのシェルのマニュアルページには、ビルトインのリストもあります。

編集:typeを使用してコマンドが組み込みかどうかを調べ、そうでない場合はwhichを使用してコマンドの実行元を確認します。

1
Caleb