Linuxでコマンドを実行するとどうなりますか?

ほとんどのLinuxユーザーは、オペレーティングシステムの内部動作に気付いていないことがよくあります。シェルでLinuxコマンドを長時間実行しているかもしれませんが、 Enterキーを押したときに、舞台裏で何が起こっているのか疑問に思ったことはありませんか?

最後に、シェルがLinuxで型指定されたコマンドを処理する方法について簡単に理解できるようになります。

コマンドの処理

コマンドを入力するとき、シェルが最初に行うことは、コマンド全体を「トークン」に分割することです。次に、シェルはコマンドラインの最初のトークンに属するプログラム名を探します。

$ PATH環境変数で定義された検索パスのディレクトリ、または演算子を使用したローカルディレクトリのいずれにも見つからない場合、またはシェルエイリアスまたはシェル関数ではない場合、シェルはエラーを返します。 。有効なコマンドが見つかった場合、シェルは他の各トークンを調べて、それが変数、シェルパラメータ、またはコマンドの引数であるかどうかを判断します。

シェルがそれがホームディレクトリの演算子のような変数またはパラメータであると判断した場合、シェルはそれらを展開するか、コマンドで元の値に置き換えます。

シェルがパラメータまたは変数を展開すると、コマンド文字列をコマンドに渡し、引数を指定してプログラムを実行します。シェルは、引数が有効かどうかを判断しません。それがコマンドの仕事です。

コマンドの実行

シェルが別のコマンドを起動すると、以前使用していたのと同じプロンプトにどのように戻りますか?シェルはそれ自体のコピーを作成します。これはフォークと呼ばれるプロセスです。このシェルのコピーは、それ自体をコマンドに置き換え、以前に処理されたすべての引数を使用します。これは「exec」と呼ばれ、結合されたプロセスは「fork-and-exec」と呼ばれます。

たとえば、lsコマンドを実行すると、シェルプロセスはfork()メソッドを使用して自分自身をforkし、別のシェルインスタンスを作成します。システムで実行されている2つのシェルプロセスのうち、追加のシェルはexec()関数を使用してlsを実行し、それ自体をlsコマンドのインスタンスに変換します。

その間、元のシェルはコマンドが完了するのを待ちます。これが、ジョブ制御を使用してジョブを一時停止し、シェルのバックグラウンドでジョブを実行させることができる理由です。

関連: Linuxのプロセスとは何ですか?

終了ステータスの報告

Linuxコマンドは、終了ステータスを介して正常に実行されたかどうかを報告します。名前が示すように、プログラムは実行が終了すると終了ステータスを報告します。彼らは$を通してこれをしますか?最後の実行コマンドの終了ステータスを含む環境変数。

慣例により、終了ステータス0は実行が成功したことを示し、0以外は通常エラーを意味します。プロンプトの構成方法によっては、シェルがコマンドラインでゼロ以外の終了ステータスを示す場合もあります。

上のスクリーンショットは、コマンドが存在しないためにエラー終了ステータスが127であることを示すカスタマイズされたZshプロンプトを示す例です。

これで、Linuxコマンドのしくみがわかりました

Linuxシェルがコマンド、フォーク、およびexec自体を処理する方法、およびプログラムが終了ステータスを報告する方法を理解したので、コマンドラインをより効果的に使用できます。

ユーザーはいくつかのLinuxシェルを無料で利用できます。それらのそれぞれは多かれ少なかれ同じ仕事をしますが、それらは多くの面で異なります。システムにいくつかのシェルをインストールしてみて、どれが自分に最も適しているかを自分で決めることができます。