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


72

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

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

...そして、これらの組み込みの決定的な(現在の)リストはありますか?

回答:


90

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

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

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

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

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

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


実際には、アプリケーションは割り込みを発行してカーネルと通信します。
ネイサンオスマン

11
@George:アプリケーションは、OSおよびアーキテクチャに応じて割り込みを使用する場合としない場合があるsyscallを発行することにより、カーネルと通信します。原則として、ユーザーは割り込みを発行しません。
ジル

2
@cjm:そのように説明するととても簡単に聞こえます:)...あなたは確かに霧をクリアするのを手伝いました...ただの軽い霧..(実際、それはまさに今朝の天気です。 ..快く霧深い;)...ありがとう
Peter.O

@Gilles:本当ですか?私はすべてのユーザーモードプログラムが割り込みを介してカーネルと通信することを考えました(もちろん、特定のアーキテクチャ)。
ネイサンオスマン

2
@cjm非常に徹底的で有益な答え。私はそれを読むことをたくさん学びました。:)
ankush981

37

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

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

    • 間違った引数を特別なビルトインに渡すと、エラーメッセージを表示した後に次のコマンドにスキップするのではなく、シェル自体が中止する場合があります。
    • 事前割り当て構文foo=bar utilityには別の意味foo=bar; utilityがあります。ユーティリティの期間だけ環境に割り当てるのではなく、通常のパラメーター割り当て(つまりに相当)です。
  • 一部のユーティリティは、シェルの内部設定に基づいて動作するため、シェル内に実装する必要があります。これも:

    • 以下のようなシェルのカレントディレクトリに作用するユーティリティcddirspushdpopd
    • ジョブ制御のようなユーティリティbgdisownfgjobswait
    • 読み取りまたは例えば他のシェルの属性を操作ユーティリティbuiltincommandhashreadtypeulimitumask
    • 以下のようなインタラクティブな機能に関連するユーティリティは、それらが存在しています、fchistorybind
  • 一部のユーティリティは通常、純粋のために構築されたインとして実装された性能echoprintftesttruefalse

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

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


3
これらの違いは本当に重要なものです。
dmckee

簡単な質問ですが、「通常のパラメーターの割り当て」とはどういう意味while IFS= read -r lineですか?
セルギーKolodyazhnyy

@SergiyKolodyazhnyy readは特別なビルトインではないためIFS=read、コマンドの実行中のみ変数を設定します。
ジル

10

組み込みコマンドは、外部プログラムではなく、シェルによって提供されるコマンドです。ここのためにリストされているbashの組み込みコマンド(彼らはまた、bashのmanページに記載されています)とzshの組み込みコマンドがkshを実行してリストを提供しますbuiltin

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


typeトリックをするようです; 感謝します...しかし、「シェルが提供する」とはどういう意味なのでしょうか...おそらく、シェルがカーネルにどのように関係するかをより完全に理解する必要があります。明日これに戻る
Peter.O

1

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

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

編集:typeコマンドが組み込みコマンドであるかどうかを調べ、そうでない場合はwhichどこから実行されるかを知るために使用します。


@Caleb:あなたのコメントに感謝しますが、「システムプロセス」とは何なのか疑問に思うようになります。それまで参照し続けていますが、その違いがどこにあるのか理解できません。 'which'が絶対インジケータである方法を参照してください).... 'which echo =>"/bin/echo" and type echo =>"echo is a shell builtin", but 'which dd=> "/ bin / dd" and type dd=> "dd is / bin / dd" ...だから、私はそこにいる....
Peter.O

「システムプロセス」とは、カーネルによって管理される独立したアプリケーションとして起動されることを意味します。ビルトインの場合の代替案は、すでに実行されているシェルのコードでサブ関数を実行するだけです。あなたが与える例でtypeは、実行されているもののより良い指標ですが、あなたechoは組み込みであり、その名前のアプリケーションがあることに気づきます。シェルにシステムが組み込まれていない場合、システムが実行されます。
カレブ

2
whichは必ずしも組み込みコマンドではなく、そうでない場合は、シェルの組み込みコマンドを認識しません。POSIXではtype組み込みコマンドが必要であるため、常に組み込みコマンドを認識しています。
cjm

多くのシステムには、whichtoのエイリアスtypeまたはオプションのセットが付属しています。たとえば、alias which='type -path'これが混乱の原因になる可能性があります。
ランダム832

1
which置き換えられるまで、これを支持することはできませんtype。私は、それを何度も何度も知っていなかっtypeたので、ラーニングに非常に驚いてwhichいました。
ユーザー不明
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.