同じ名前の組み込みコマンド、キーワード、および/または外部コマンドがあるときにBashシェルが実行するコマンドを決定する順序は何ですか?
例えば、
- キーワード
time
と外部コマンドtime
、 - coreutils用の組み込み
printf
および外部コマンドprintf
。
ベストアンサー1
コマンドを単語に分割して単純なコマンドとオプションのパラメータリストを生成すると、次のことが行われます。
コマンド名にスラッシュが含まれていない場合、シェルはスラッシュを見つけようとします。その名前のシェル関数が存在する場合は、次のように呼び出されます。シェル機能。
名前が関数と一致しない場合、シェルはシェル組み込み関数のリストからその名前を検索します。一致するものが見つかると、組み込み関数が呼び出されます。
名前がシェル関数でも組み込み関数でもなく、スラッシュを含まない場合、Bashは
$PATH
その名前の実行可能ファイルを含むディレクトリ内のすべての要素を検索します。 Bashは複数の検索を避けるためにハッシュテーブルを使用して実行可能ファイルのフルパス名を覚えていますPATH
(参照:Bourne Shell 組み込み関数)。$PATH
ハッシュテーブルでコマンドが見つからない場合にのみ、ディレクトリ全体の検索が実行されます。検索に失敗すると、シェルは名前が定義されているシェル関数を検索しますcommand_not_found_handle
。関数が存在する場合、関数は元のコマンドと元のコマンドの引数を引数として呼び出され、関数の終了状態はシェルの終了状態になります。この関数が定義されていない場合、シェルはエラーメッセージを出力し、終了ステータス127を返します。検索が成功した場合、またはコマンド名に少なくとも1つのスラッシュが含まれている場合、シェルは別の実行環境で指定されたプログラムを実行します。パラメーター0は指定された名前に設定され、コマンドの残りのパラメーターは指定されたパラメーター(存在する場合)に設定されます。
ファイルが実行可能な形式ではなくファイルがディレクトリではないために実行が失敗すると、そのファイルはシェルスクリプトと見なされ、シェルは次の説明に従って実行します。シェルスクリプト。
コマンドが非同期的に開始されない場合、シェルはコマンドが完了するのを待って終了ステータスを収集します。