web-dev-qa-db-ja.com

「test」という名前の実行可能ファイルは$ PATHにありますが実行されません

$ HOME/binにtestというファイルがあります(質問する前に、はい、私のパスにあります)。このファイルは、ファイルへの完全パスで実行すると問題なく実行できることを確認しました。ただし、この方法で実行しないと、非常に奇妙な問題が発生します。ターミナルでtestを実行すると、何も実行されず、すぐに戻ります。これは、いくつかの理由でファイルを見つけることの問題ではないことを知っています。

  1. エラーメッセージはありません。通常、ファイルが見つからない、または実行できない場合は、その旨のメッセージが出力されます。

  2. ランニング which testは引き続き正しいファイルパスを返します。

  3. おそらく最も奇妙なことです-straceを実行すると、スクリプトは正常に動作します。 straceを使用して何が起こっているのか理解できるかどうかを確認しようとしましたが、straceを使用して実行すると、問題は0で予想どおりに機能しました。

13
ContronThePanda

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 testtest is a Shell builtinを示します。

参照: 「which」を使用しないのはなぜですか?次に何を使用するのですか?

45
ilkkachu