Bashで実行される実行可能ファイルの順序

Bashで実行される実行可能ファイルの順序

testBashでコマンドを実行すると、組み込みtestユーティリティ(条件式評価)が開始されます。

$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$ 

しかし、上記の出力からわかるように、type -a test/usr/local/binディレクトリに別のものがあり、/ testusr/binディレクトリに別のものがあります。組み込みコマンドが常に優先され、残りは$ PATH変数のディレクトリの順序に依存するように、実行可能ファイルの順序はどうなりますか?また、実行可能ファイルの開始順序を変更できますか?たとえば、test/usr/bin/test と入力すると bash-buildin の代わりに起動されますかtest

答え1

最も高い優先順位は、bashエイリアス、特別な組み込み(POSIXモードでのみ)、関数、組み込み、です$PATH

内蔵機能を実行するにはを使用してくださいbuiltin test
外部アプリケーションを実行するには、明示的なパスを使用してください/bin/test
関数とエイリアスを無視するには、を使用しますcommand test
エイリアスを無視するには、\testまたは他の種類の拡張機能を使用してください。

内蔵を無効/有効にできますenable test


(以下の説明に基づいて更新されdisableますenable

答え2

組み込みコマンドは常に外部コマンドよりも優先されます。その根拠は、組み込みコマンドがより高速であることです(または、またはcdいくつかのケースでは、組み込みコマンドだけが望ましい効果を得ることができます)。test -o BASH_OPTION

時々、外部コマンドにはシェルの組み込みコマンドにはない機能があります。この場合、明示的なパス(スラッシュを含む)を指定して外部コマンドを呼び出すことができます(これにより、中央のソート順序に関する懸念は無視されます$PATH)。外部パスをハードコードしたくないが、組み込みパスを使用したくない場合は、bash、ksh、およびzshでそれらを使用できます"$(type -P test)"(大文字の使用を参照)。外部コマンドを強制するもう1つの方法は、ユーティリティ()を使用することです。P"$(whence -p test)"=testenvenv test …

zshでは、組み込み機能の無効化を使用できますdisable test。これは、組み込み機能が再び有効になるまで(現在のシェルまたはサブシェルに対して)永続的ですenable test。 Bashでは、同じことを無効にして再度enable -n test有効enable testにできます。

alias test=/usr/bin/testエイリアスや関数を使用して、または他のコマンドを強制できますtest () { /usr/bin/test "$@"; }。そのような別名がある場合は、その別名の一部を参照して、その別名の使用を防ぐことができます。たとえば、\test汎用関数/組み込み/外部照会が実行されます。シェルとその設定によっては、関数を読み取ったり実行したりすると、関数のエイリアス定義が拡張されることがあります。関数を定義すると、command test関数の照会や別名の照会を防ぐために使用できます。したがって、test無効にしない限り、組み込み関数はここで呼び出されます。

関連情報