質問: 組み込みコマンドとそうでないコマンドの違いは何ですか? 組み込みコマンドと名目上同じことを実行できる別のコマンドの間に本質的な違いはありますか?例えば。ビルトインは「特別な」扱いを受けますか? ...それらを実行するオーバーヘッドが少ないですか? ..または、単に「組み込まれている」だけですか。あなたの車のダッシュボードのように?...そして、これらのビルトインの決定的な(現在の)リストはありますか?
回答: 組み込みユーティリティには3つのレベルがあります。 一部のユーティリティ は、実際にはプログラミング言語としてシェルの一部ですが、 予約語 ではありません。これらは、制御フローユーティリティ(_._、_:_、break、continue、return、trap、exit、exec、eval)、パラメータ関連ユーティリティ(set、unset、shift、export、readonly、local1ありますtypeset1)、エイリアスユーティリティ(alias2、unalias2)およびtimes3。これら 特別な組み込み は特別な扱いを受けます: 間違った引数を特別な組み込みに渡すと、エラーメッセージを表示した後で次のコマンドにスキップするのではなく、シェル自体が異常終了する場合があります。 割り当て前の構文_foo=bar utility_には別の意味があります。これは、ユーティリティの期間のみ環境に割り当てるのではなく、通常のパラメーター割り当て(つまり、_foo=bar; utility_と同等)です。 一部のユーティリティneedは、シェルの内部設定で動作するため、シェル内に実装する必要があります。これも: シェルの現在のディレクトリに作用するユーティリティ(cd、dirs、pushd、popdなど)。 bg、disown、fg、jobs、waitなどのジョブ制御ユーティリティ。 builtin、command、hash、read、type、ulimit、umaskなどの他のシェル属性を読み取りまたは操作するユーティリティ。 fc、history、bindなどのインタラクティブ機能に関連するユーティリティ。 一部のユーティリティは通常、純粋にパフォーマンスの組み込みとして実装されます:echo、printf、test、true、false。 bash 、 ksh 、および zsh などの高度なシェルには、通常、より多くの組み込み機能があり、非標準機能を実装することがよくあります(通常は対話用)。各シェルのマニュアルには、どのコマンドが組み込みであるかが記載されていますが、一部のシェル( zsh 、少なくとも)は、より多くの組み込みを提供できる動的にロード可能なモジュールをサポートしています。1 posixには不明ですが、kshおよびその他のいくつかのシェルでは特別です。 2 posixでは通常ですが、kshおよびその他のいくつかのシェルでは特別です。 3 kshでは、timesは time キーワードのラッパーです。これは_{ { time;} 2>&1;}_のエイリアスです。 posixでは、timeを、通常の解析またはパイプライン全体(ksh、zshのbash)に適用されるキーワードを持つ外部ユーティリティにすることができます。