回答:
あなたのコメントから、あなたはシェルが何であるかについて正確に混乱しているようです。カーネルは、システムの管理を担当します。実際にプログラムをロードして実行したり、ファイルにアクセスしたり、メモリを割り当てたりする部分です。しかし、カーネルにはユーザーインターフェイスがありません。別のプログラムを仲介として使用することでのみ通信できます。
シェルとは、プロンプトを出力し、ユーザーからの入力行を読み取り、ファイルを操作したり他のプログラムを実行したりするための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
がシェルの組み込みではない場合、シェルの組み込みについてはおそらく知らないでしょうが、外部プログラムを探すだけです。
組み込みユーティリティには3つのレベルがあります。
一部のユーティリティは、予約語ではありませんが、実際にはプログラミング言語としてシェルの一部です。これらは、制御フローユーティリティ(ある.
、:
、break
、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
。bash、ksh、zshなどの高度なシェルには通常、多くの場合、非標準機能(通常は対話用)を実装するための組み込みがあります。各シェルのマニュアルには、どのコマンドが組み込まれているかが記載されていますが、一部のシェル(少なくともzsh)は、より多くの組み込みを提供できる動的にロード可能なモジュールをサポートしています。
¹POSIXには不明ですが、kshおよびその他のいくつかのシェルで特別です。
²POSIX では通常ですが、kshおよび他のいくつかのシェルでは特別です。
³ ではksh
、times
ラッパーですtime
キーワード:それはの別名です{ { time;} 2>&1;}
。POSIXではtime
、通常の解析を使用する外部ユーティリティ、またはパイプライン全体(kshにある、zshにあるbash)に適用されるキーワードにできることに注意してください。
while IFS= read -r line
ですか?
read
は特別なビルトインではないためIFS=read
、コマンドの実行中のみ変数を設定します。
組み込みコマンドは、外部プログラムではなく、シェルによって提供されるコマンドです。ここのためにリストされているbash
の組み込みコマンド(彼らはまた、bashのmanページに記載されています)とzsh
の組み込みコマンドが。ksh
を実行してリストを提供しますbuiltin
。
特定のコマンドが組み込みコマンドかどうかを知るには、を実行しtype command
ます。試してみてくださいtype for
とtype ls
、これを参照してください。
type
トリックをするようです; 感謝します...しかし、「シェルが提供する」とはどういう意味なのでしょうか...おそらく、シェルがカーネルにどのように関係するかをより完全に理解する必要があります。明日これに戻る
すべてのディストリビューションとシェルには、コマンドと組み込みシェル関数の異なるコレクションがあります。一般に、シェルは、時間、速度を節約し、他の機能セットと統合するために最も一般的でシンプルな機能を組み込みます。別のシステムプロセスを起動する必要がないため、オーバーヘッドははるかに低くなります。ただし、組み合わせて使用することは可能です。何かのビルドインを持つ1つのシェルを実行できますが、システムにもそのコマンドがあります。通常、組み込みが優先されますが、それを制御できます。
を実行すると、特定のコマンドが組み込みコマンドかどうかを簡単に確認できますtype mycommand
。ほとんどのシェルのマニュアルページにも組み込みのリストがあります。
編集:type
コマンドが組み込みコマンドであるかどうかを調べ、そうでない場合はwhich
どこから実行されるかを知るために使用します。
=>"/bin/echo" and
type echo =>"echo is a shell builtin", but 'which dd
=> "/ bin / dd" and type dd
=> "dd is / bin / dd" ...だから、私はそこにいる....
type
は、実行されているもののより良い指標ですが、あなたecho
は組み込みであり、その名前のアプリケーションがあることに気づきます。シェルにシステムが組み込まれていない場合、システムが実行されます。
which
は必ずしも組み込みコマンドではなく、そうでない場合は、シェルの組み込みコマンドを認識しません。POSIXではtype
組み込みコマンドが必要であるため、常に組み込みコマンドを認識しています。
which
toのエイリアスtype
またはオプションのセットが付属しています。たとえば、alias which='type -path'
これが混乱の原因になる可能性があります。
which
置き換えられるまで、これを支持することはできませんtype
。私は、それを何度も何度も知っていなかっtype
たので、ラーニングに非常に驚いてwhich
いました。