コマンド叩いたときに、シェルがやってるのは大筋で、

1. 入力を、変数展開とかクォート処理ののちトークンに分割。
2. 環境変数PATHの要素のディレクトリそれぞれについて
一覧を見て、第1トークンに一致する実行ビットの立っているなものを探す。
3. 見つかったらそいつに残りトークンを添えてexec(2)系システムコールを発行してwait。
見つからなければCommand not found.

あとはカーネルの仕事。