
これは私がいつも疑問に思った一般的な質問ですが、簡単に説明すると、bashはスクリプトまたはターミナルを介して与えられたコマンドをどのように実行しますか?
私は次のようにすべてのコマンドを調べるために複数のifステートメントを持つことができると思いました(疑似コード)。
if (command == "pwd") pwd();
else if (command == "echo") echo();
...
ただし、Firefoxやgeditなどのプログラムに対して実行されるコマンドなど、新しいコマンドが追加されるたびにコードを再コンパイルする必要があるため、問題が発生します。
その後、このコマンドが思い出されました。このwhich
コマンドは(あまり意図せずに)与えられたコマンドのディレクトリを指し、これはbashがファイルを見つけ、iostreamを使ってファイルを実行すると仮定します。
そうですか?では、どのメソッドを呼び出すのか、どうすればわかりますか?それとも単なる一般的な実行可能ファイルですか?
答え1
コマンドが存在する場合、内部で動作する方法は次のとおりです。通常の一般的な標準入力を使用してコマンド(スクリプトから来たかどうかにかかわらず)とその引数を保存し、解析して次のようにシステムコールに送信execve
します。その後、システムでコマンドを実行します。
http://man7.org/linux/man-pages/man2/execve.2.html
また、Time4Teaが述べたように、実行中のシェルに固有の組み込みコマンドがいくつかあります。exit
その一つです。
経験上、既存の方法でLinuxについて理解できない場合は、ソースコードを見つけてください。
答え2
デフォルトでは、一部のコマンドはbashシェルプログラム自体に組み込まれています(例:echo、set)。この場合、bashには、コマンドラインから呼び出されたユーザーに応答してこれらのコマンドを内部的に実行するためにコンパイルされたコードがあります。man bash
または のマニュアルを見るとinfo bash
「内蔵機能」のリストがあります。
組み込みコマンド中にコマンドが存在しない場合、シェルは$ PATH環境変数にリストされているディレクトリ(リストされた順序で)を検索して、そこから外部コマンドを見つけることができることを確認します。それ以外の場合は、コマンドが見つかりませんでしたエラーが報告されます。