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

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

組み込みコマンドと名目上同じことを行う他のコマンドの間に根本的な違いはありますか?

例えば。組み込み関数は「特別な」処理を受けますか? ...実行に費やすオーバーヘッドは少ないですか? ..または単に車のダッシュボードのように「組み込み」になっていますか?

...これらの組み込み関数の明示的な(現在の)リストはありますか?

答え1

あなたの意見を見ると、正確に何が混乱しているようです。シェルはい。カーネルはシステム管理を担当します。実際にプログラムをロードして実行し、ファイルにアクセスし、メモリを割り当てるなどの作業をする部分です。ただし、カーネルにはユーザーインターフェイスはありません。他のプログラムを仲介者として使用しなければ通信できません。

シェルはプロンプトを印刷し、入力内容の1行を読み取り、それを1つ以上のコマンドとして解釈してファイルを操作するか、別のプログラムを実行するプログラムです。 GUIが発明される前に、シェルはオペレーティングシステムの基本的なユーザーインターフェースでした。 MS-DOSではシェルが呼び出され、command.com人々は通常これを変更しません。しかし、Unixでは長い間複数の殻ユーザーはその中から選択できます。

彼らは3つのタイプに分けることができます。 Bourne互換シェルは元のバージョンから派生した構文を使用します。ボンシェル。 Cシェルは生の構文を使用します。Cシェル。独自の構文を作成するか、プログラミング言語から構文を貸す非伝統的なシェルもあり、通常は最初の2種類よりも人気がありません。

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

第二に、組み込みコマンドはシェルの内部状態に影響を与える可能性があります。そのため、このようなコマンドを発行します。cd 〜しなければならない外部プログラムがシェルの現在のディレクトリを変更できないため、組み込みです。効率性のために他のコマンド(たとえばecho)が組み込まれている可能性がありますが、外部コマンドではないという本質的な理由はありません。

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

答え2

組み込みユーティリティは3つのレベルに分けられます。

  • 一部のユーティリティシェルは実際にはプログラミング言語の一部です。予約語。制御フローユーティリティ(.、、、、、、、、、、、、)、パラメータ関連:ユーティリティ(、、、、、、、1、1 )、エイリアスユーティリティ(2、2 )、およびbreak3 。これらcontinuereturntrapexitexecevalsetunsetshiftexportreadonlylocaltypesetaliasunaliastimes特殊内蔵特別扱いを受ける:

    • 無効な引数が特殊な組み込みコマンドに渡されると、エラーメッセージが表示された後に次のコマンドに移動するのではなく、シェル自体がクラッシュする可能性があります。
    • 事前割り当て構文は異なる意味を持ちます。これは、ユーティリティ期間中にのみ環境に割り当てるのではなく、foo=bar utility一般的なパラメータ割り当て(例:と同じ)です。foo=bar; utility
  • 一部のユーティリティ必要シェルの内部設定に従って動作するため、シェルの内部で実装されます。これには以下が含まれます。

    • シェルの現在のディレクトリで動作するユーティリティ(例cddirs、、、、pushd; popd
    • bg、、、disownなどfgのジョブ制御ユーティリティjobswait
    • builtin、、、、、、、などのcommand他のシェル属性を読み取ったり操作したりするためのユーティリティです。hashreadtypeulimitumask
    • インタラクティブ機能(存在する場合)に関連するユーティリティ(たとえばfc、、historybind
  • 一部のユーティリティは、純粋に組み込み機能として実装されることがよくあります。パフォーマンスecho、、、、、、、。printftesttruefalse

次の高度なシェル強く打つケシそして扱いにくい一般に、非標準機能を実装するための(通常相互作用のための)組み込み関数が多くあります。各シェルのマニュアルには、どのコマンドが組み込まれているかを教えてくれます。しかし、いくつかのシェル(扱いにくい少なくとも)動的にロード可能なモジュールをサポートすることで、より多くの組み込みモジュールを提供できます。

1はPOSIXでは知られていませんが、kshや他の多くのシェルでは特別です。
²POSIXでは一般的ですが、kshや他の多くのシェルでは特別です。
³では、が周辺にありますkshtimestimeキーワード:のエイリアスです{ { time;} 2>&1;}。 POSIXでは、time一般的な解析またはパイプライン全体(kshの場合はzshのbash)に適用されるキーワードを使用して外部ユーティリティにすることができます。

答え3

組み込みコマンドは、外部プログラムではなくシェルが提供するコマンドです。以下のリストは次のとおりです。bash組み込み機能(bashのマニュアルページにも記載されています)zsh組み込み機能kshを実行してリストを提供しますbuiltin

特定のコマンドが組み込まれていることを確認するには、以下を実行してを参照type commandしてください。type fortype ls

答え4

各ディストリビューションとシェルには、異なるコマンドセットと組み込みシェル機能があります。一般に、シェルのアイデアは、最も一般的でシンプルな機能を構築することで、時間を節約し、スピードを上げ、残りの機能セットと統合することです。他のシステムプロセスを開始する必要がないため、オーバーヘッドははるかに低くなります。しかし、混合とマッチングは可能です。一種の組み込みコマンドを持つシェルを実行している可能性がありますが、そのコマンドはシステムでも使用できます。通常、組み込み関数が優先されますが、これを制御できます。

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

編集する:typeコマンドが組み込みコマンドか、そうでない場合は、whichそのコマンドが実行される場所を確認するために使用されます。

関連情報