$ HOME/binにtest
というファイルがあります(質問する前に、はい、私のパスにあります)。このファイルは、ファイルへの完全パスで実行すると問題なく実行できることを確認しました。ただし、この方法で実行しないと、非常に奇妙な問題が発生します。ターミナルでtest
を実行すると、何も実行されず、すぐに戻ります。これは、いくつかの理由でファイルを見つけることの問題ではないことを知っています。
エラーメッセージはありません。通常、ファイルが見つからない、または実行できない場合は、その旨のメッセージが出力されます。
ランニング which test
は引き続き正しいファイルパスを返します。
おそらく最も奇妙なことです-strace
を実行すると、スクリプトは正常に動作します。 strace
を使用して何が起こっているのか理解できるかどうかを確認しようとしましたが、strace
を使用して実行すると、問題は0で予想どおりに機能しました。
test
は使用するのが残念な名前で、条件付きテストの 標準ユーティリティ です。 (実際には[
のif [ ... ]
と同じコマンドですが、は構文のように見えますが、実際には通常のコマンド。)
test
も組み込まれています。 Bashなので、test
だけを実行しても、パスからバイナリが検索されることはありません。
bash$ help test | head
test: test [expr]
Evaluate conditional expression.
Exits with a status of 0 (true) or 1 (false) depending on
the evaluation of EXPR. Expressions may be unary or binary.
[...]
引数なしのtest
は、1(false)を返します。
strace
はユーティリティ自体を実装していないため、strace test
の実行にはShellビルトインは含まれません。 PATH
にあるものを使用するだけです。おそらく/bin/test
または/usr/bin/test
に標準のtest
があるので、それがPATH
の最初にある場合、strace
が実行されます。
私のBashでは、which
も外部コマンドであるため、組み込みコマンドについても考えていません。一方、 the type
command はシェルに組み込まれており、type test
はtest is a Shell builtin
を示します。