test
Bashでコマンドを実行すると、組み込み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ディレクトリに別のものがあり、/ test
usr/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)"
=test
env
env 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
無効にしない限り、組み込み関数はここで呼び出されます。