
外部コマンドが別々のプロセスを作成してシェルで実行されることを知っていますが、シェルで組み込みコマンドを実行するとどうなりますか?
関数として実行されますか、シェルはそれを実行するために新しいスレッドを作成しますか?
答え1
cd_builtin
具体的な例には、buildins/cd.def(bashソースコード)で定義された関数があります。通常cd
、この関数を呼び出すことによって行われます。ただし、パイプラインで使用している場合は、最初に分岐できます。たとえば、cd / | echo
子を分岐して呼び出しますcd_builtin
。実際には変更されていないディレクトリを介して確認することもできます。
anthony@Zia:~$ cd /tmp/
anthony@Zia:/tmp$ cd / | echo -n
anthony@Zia:/tmp$ cd /
anthony@Zia:/$
ディレクトリはパイプしない場合にのみ変更されることに注意してくださいcd
。
答え2
定義に応じて、組み込みコマンドは他のプログラムではなくデフォルトの実行可能ファイル内で実行されます。
すべてのシェルコマンドは同期です。シェルは、次のコマンドを実行する前にコマンドが完了するのを待ちます。外部コマンドを実行すると、シェルはコマンドを実行し、コマンドが終了するのを待つ必要がある別のプロセスを作成する必要があります。組み込みコマンドの実行時に新しい実行スレッドを作成する必要はありません。コマンドは基本スレッド内で実行されます。
私は一般的なシェルが内部デザインにスレッドを使用しないと思います。シェル機能は既存のプロセスごとにシングルスレッドUnixモデルと密接に関連しているため、スレッドはシェル設計のすべての問題を解決できます。
各組み込み関数は、シェルソースコードの特定のレベルにある関数として実装される可能性が高くなります。
答え3
私の考えでは、実行空間内で関数として実行されると思いますbash
。コメントが1つあります高度なバッシュスクリプトガイドその声明は次のとおりです。
抜粋
組み込みコマンドは、実際に組み込まれたBashツールセットに含まれるコマンドです。これはパフォーマンス上の理由の1つです。組み込みコマンドは通常、分岐が必要な外部コマンドよりも速く実行されます。1別々のプロセス - または特定の組み込み機能がシェルの内部に直接アクセスする必要があるためです。