組み込みコマンドと名目上同じことを行う他のコマンドの間に根本的な違いはありますか?
例えば。組み込み関数は「特別な」処理を受けますか? ...実行に費やすオーバーヘッドは少ないですか? ..または単に車のダッシュボードのように「組み込み」になっていますか?
...これらの組み込み関数の明示的な(現在の)リストはありますか?
答え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 )、およびbreak
3 。これらcontinue
return
trap
exit
exec
eval
set
unset
shift
export
readonly
local
typeset
alias
unalias
times
特殊内蔵特別扱いを受ける:- 無効な引数が特殊な組み込みコマンドに渡されると、エラーメッセージが表示された後に次のコマンドに移動するのではなく、シェル自体がクラッシュする可能性があります。
- 事前割り当て構文は異なる意味を持ちます。これは、ユーティリティ期間中にのみ環境に割り当てるのではなく、
foo=bar utility
一般的なパラメータ割り当て(例:と同じ)です。foo=bar; utility
一部のユーティリティ必要シェルの内部設定に従って動作するため、シェルの内部で実装されます。これには以下が含まれます。
- シェルの現在のディレクトリで動作するユーティリティ(例
cd
:dirs
、、、、pushd
;popd
) bg
、、、disown
などfg
のジョブ制御ユーティリティjobs
。wait
builtin
、、、、、、、などのcommand
他のシェル属性を読み取ったり操作したりするためのユーティリティです。hash
read
type
ulimit
umask
- インタラクティブ機能(存在する場合)に関連するユーティリティ(たとえば
fc
、、history
)bind
。
- シェルの現在のディレクトリで動作するユーティリティ(例
- 一部のユーティリティは、純粋に組み込み機能として実装されることがよくあります。パフォーマンス:
echo
、、、、、、、。printf
test
true
false
次の高度なシェル強く打つ、ケシそして扱いにくい一般に、非標準機能を実装するための(通常相互作用のための)組み込み関数が多くあります。各シェルのマニュアルには、どのコマンドが組み込まれているかを教えてくれます。しかし、いくつかのシェル(扱いにくい少なくとも)動的にロード可能なモジュールをサポートすることで、より多くの組み込みモジュールを提供できます。
1はPOSIXでは知られていませんが、kshや他の多くのシェルでは特別です。
²POSIXでは一般的ですが、kshや他の多くのシェルでは特別です。
³では、が周辺にありますksh
。times
time
キーワード:のエイリアスです{ { time;} 2>&1;}
。 POSIXでは、time
一般的な解析またはパイプライン全体(kshの場合はzshのbash)に適用されるキーワードを使用して外部ユーティリティにすることができます。
答え3
組み込みコマンドは、外部プログラムではなくシェルが提供するコマンドです。以下のリストは次のとおりです。bash
組み込み機能(bashのマニュアルページにも記載されています)zsh
組み込み機能。ksh
を実行してリストを提供しますbuiltin
。
特定のコマンドが組み込まれていることを確認するには、以下を実行してを参照type command
してください。type for
type ls
答え4
各ディストリビューションとシェルには、異なるコマンドセットと組み込みシェル機能があります。一般に、シェルのアイデアは、最も一般的でシンプルな機能を構築することで、時間を節約し、スピードを上げ、残りの機能セットと統合することです。他のシステムプロセスを開始する必要がないため、オーバーヘッドははるかに低くなります。しかし、混合とマッチングは可能です。一種の組み込みコマンドを持つシェルを実行している可能性がありますが、そのコマンドはシステムでも使用できます。通常、組み込み関数が優先されますが、これを制御できます。
を実行すると、特定のコマンドが組み込みコマンドであるかどうかを簡単に確認できますtype mycommand
。ほとんどのシェルのマニュアルページには組み込み機能のリストもあります。
編集する:type
コマンドが組み込みコマンドか、そうでない場合は、which
そのコマンドが実行される場所を確認するために使用されます。