Bashでtest
コマンドを実行すると、-VARIABLE-(条件式を評価)組み込みユーティリティが起動します。
$ 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ディレクトリには別のtest
があります。実行可能ファイルの順序はどのようになっていますか?つまり、組み込みコマンドは常に優先され、残りのコマンドは$ PATH変数のディレクトリ順序に依存していますか?さらに、開始された実行可能ファイルの順序を変更することは可能です。 test
と入力すると、bash-builtin test
?の代わりに/ usr/bin/testが開始されます。
最も優先順位が高いのはbashエイリアス、次に特別なビルトイン(POSIXモードのみ)、関数、ビルトイン、そして$PATH
の検索です。
組み込みを実行するには、builtin test
を使用します。
外部アプリケーションを実行するには、明示的なパス/bin/test
を使用します。
関数とエイリアスを無視するには、command test
を使用します。
エイリアスのみをバイパスするには、\test
またはその他の種類の展開を使用します。
enable test
を使用して、組み込みを無効/有効にすることができます。
(以下のコメントに従って更新)
(bashにdisable
が組み込まれているという誤った管理者編集を修正-実際にはenable
しかない)
組み込みコマンドは常に外部コマンドよりも優先されます。理論的根拠は、組み込みコマンドの方が速いということです(cd
やtest -o BASH_OPTION
などのいくつかのケースでは、組み込みコマンドだけが目的の効果を持つことができます)。
場合によっては、外部コマンドにShellビルトインにはない機能があることがあります。その場合、明示的なパス(つまり、スラッシュを含む)を指定して外部コマンドを呼び出すことができます(これにより、$PATH
の順序に関する懸念が回避されます)。外部パスをハードコーディングしたくないが、組み込みの使用を防ぎたい場合は、bashで"$(type -P test)"
(大文字P
に注意)を使用できます"$(whence -p test)"
、zshでは=test
。外部コマンドの使用を強制するもう1つの方法は、command
ビルトイン(command -p 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
ビルトインが呼び出されます)。