同じ名前の内部コマンドと外部コマンド(プログラム)がある場合、デフォルトではどちらが実行されますか?

同じ名前の内部コマンドと外部コマンド(プログラム)がある場合、デフォルトではどちらが実行されますか?

bashには と呼ばれる内部コマンドがありkill、Linux には と呼ばれる外部コマンド (プログラム) もありますkill

killで実行するとbash、内部コマンドkillが実行されます。

質問が2つあります。

  1. デフォルトで内部コマンドの代わりに外部コマンドが実行されるように変更できる設定はありますか (もちろん、外部コマンドのフルパスを指定しなくても)。
  2. すべての(主要な)シェルで、デフォルトで外部コマンドの代わりに内部コマンドが実行されるのは標準的な動作ですか、それとも単なる慣例ですかbash?

答え1

  1. env呼び出しに使用します。

    $ env kill
    kill: not enough arguments
    $ kill
    kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
    
  2. すべてのシェルとコマンド プロセッサ。

答え2

最初の質問に対する回答: はい、デフォルトで内部コマンドではなく外部コマンドを実行する設定があります。

組み込みをオフにするには

enable -n COMMAND

組み込みを有効にするには

enable COMMAND

または、コマンドの優先順位を変更することもできます。bashコマンドの優先順位は次のとおりです:

  • 別名、最高
  • 関数
  • 組み込み
  • $PATH 内の外部コマンド

2 番目の質問について: 内部コマンドが外部コマンドよりも優先されると常に想定できると思います。これは bash に限ったことではありません。

関連情報