4

csh、tcsh、bash、perl(など)では、(必ずしも同じ構文である必要はありません)と同等のテストを実行できます。

test -e PATH; # Does PATH exist
test -f PATH; # Is PATH a file
test -d PATH; # is PATh a directory
...

バイナリがパスにあるかどうかをチェックするための同様の構造が存在しますか?(そしておそらくエイリアス、あるいはビルトインが存在するかどうか)

明らかに、これは次の形式で実行できます。

#!/usr/bin/env bash
C=COMMAND;
test $(which $C) -o $(alias $C) && "$C exists"

または他のシェル/スクリプト言語で同様のもの。

問題は、プログラムやコマンドなどの存在をテストできるかどうかではありません。問題は、組み込みテストが存在するかどうかです。

4

3 に答える 3

7

技術的には、現在のPATHものを探しているだけの場合、唯一の実際の解決策は、2番目のコードブロックの最初の部分です。

which $C

whichパスの外側を検索するので、現在のPATH実際の要件に実際に適合する唯一のものです。whereis

whereis...標準のLinuxの場所のリストで目的のプログラムを見つけようとします。

から whereis(1)

aliasもちろん、実際の実行可能ファイルとは関係ありませんが、シェル環境内のエイリアスコマンドとは関係ありません。

whereisしたがって、実際には、すでに正しいアプローチがあります。それが一連​​のテストに役立つ追加ではない可能性があることを知っていることに注意してください。

于 2011-04-27T16:33:52.360 に答える
3

あるいは単に:

type -P awk   # returns the first matched binary called 'awk' in current PATH
于 2011-04-28T13:26:46.243 に答える
2

別の解決策は

find $(echo $PATH|tr : \ ) -maxdepth 0 -executable -name Executable

ここで、Executableは、必要なアプリケーションの名前です。例えば:

find $(echo $PATH|tr : \ ) -maxdepth 0 -executable -name awk

戻り値

/usr/bin/awk
/bin/awk
于 2011-04-27T21:02:44.650 に答える