シェルの組み込み機能は実際にそのパスでプログラムを実行しますか?

シェルの組み込み機能は実際にそのパスでプログラムを実行しますか?

ここにタグ付けされた回答を読んでいます。組み込みコマンドと非組み込みコマンドの違いは何ですか?

ここで彼はこう言います。

組み込みコマンドは、他のプログラムをロードして実行する要求として解釈するのではなく、シェルが独自に実行する単純なコマンドです。これには2つの主な効果があります。まず、プログラムのロードと実行に時間がかかるため、通常は高速です。もちろん、命令の実行時間が長くなるほど、全体の実行時間に比べてロード時間が少なくなります。

cdこれは、シェルの組み込みコマンド(or)を実行すると、シェルecho(bashと仮定)が、それを取得cdしたパス(/usr/bin/cd)を使用してプログラムを実行するのとは異なる方法で解釈することを意味しますかwhich cd

私は私たちが実行したすべてのコマンドがそのプログラムを実行すると思いました。この回答を見ると混乱しました。

シェルがプログラムやファイルを実行していなくても、which cdプログラムパスが返され続けるのはなぜですか?これは、私たちがecho hiコマンドを実行するときにenv変数のパスを検索してPATH名前でプログラムを実行することを意味しますかecho

これを説明してください....

答え1

シェルは、どのユーティリティが組み込まれているかを知っています。

シェルはbash次の手順を使用してコマンドを見つけます(別名拡張を実行した後)。

  1. コマンドにスラッシュが含まれていない場合
    1. コマンドがシェル関数の場合、この関数が呼び出されます。
    2. そうでなく、組み込みコマンドに対応する場合は、そのコマンドが使用されます。
    3. それ以外の場合、シェルは$PATHその名前の実行可能ファイルを検索し、見つかった場合は実行します。
  2. コマンドにスラッシュが含まれている場合、指定されたファイルが実行されます。

これは、シェルが実行可能ファイルを検索する唯一の時間は、$PATHコマンドにスラッシュが含まれておらず、シェル機能ではなく、組み込みユーティリティではない場合であることを意味します。また、シェルはbash実行されません。物理指定されたコマンドがハッシュされると、ディレクトリが検索されます(参照help hashbash

関連情報