私が知る限り、Linuxには私たちが実行するすべてのコマンドを処理する2つの実行ステップがあります。元の単語がわからないので、理解するように名前を付けましょう。
シェル処理---コマンドを編集するシェル(個々の行に分割など)はすべて、現在のシェルとは異なるシェルで実行されます。
シェル処理後の実行結果(私たちが使用した元のシェルから)
誰かがこれらの仕事の名前が何であるかを答え、新しい学習者に最も適していると思う読書資料を参照できますか?
答え1
- シェル処理---シェル編集コマンド(他の行に分割など)
はい、そうです。シェルはコマンドを単一の文字列(通常は入力行)として受け取り、最終的に実行される実行可能ファイルに実際に移動する文字列のセットに変換します。シェルは、スペースで区切られた単語を単一の文字列から複数の文字列に分割し、引用符、拡張変数なども処理します。
そのように
ls "$options" "/filename with spaces"
(の値)と(引用符の削除)の3つの文字列をls
生成できます。これは実行中のプログラムのシステムコールに渡されます。-l
$options
/filename with spaces
exec()
これはすべて、現在のシェルとは異なるシェルで行われます。
いいえ本当に。一部のシェル拡張(例$( ... )
:)は困難な操作を実行するためのサブシェルを作成しますが、一般的な「簡単な」コマンドラインではこれは発生しません。
- シェル処理後の実行結果(私たちが使用した元のシェルから)
コマンドラインを解析した後、プログラムの実際の実行は論理的に別々のステップです。しかし、技術的には、これは他のプロセスで発生します。これは、Unixで別のプログラムを実行する方法には、最初のプロセスのコピーとしてfork()
新しいプロセスを作成する最初の呼び出しが含まれ、それをコピーの実際のプログラムexec()
(シェル)に置き換えるための呼び出しが含まれるためです。実行します(ls
例で参照)。
コマンドがexec
(で始まると、exec ls
フォークはスキップされ、シェルが起動していたコマンドに置き換えられます。
コメントで述べたように、シェル組み込み機能(echo
多くのシェルと同様)も、分岐せずに同じプロセスで実行されることがよくあります。
(上記の内容はすべて単純化されています。実際のシェルには、ここに記載されていない他の機能がある可能性があります。)