$PATHにアプリケーションがあるかどうかをテストする方法は?

$PATHにアプリケーションがあるかどうかをテストする方法は?

shすべての起動/環境スクリプトを書いて、できるだけ使いたいと思います。乾いたそしてできるだけ多く:「私が複製したすべての* nixで動作します。」これは、存在しないコードを実行しようとすると、コードが正常に失敗することを確認することを意味します。これを行うには、プログラムが存在するかどうかをテストできる必要があります。ファイルが存在するかどうかをテストする方法を知っていますが、そのパスでアプリケーションが実行可能かどうかをテストする方法がわかりません。これらのいくつかはアーチ、Ubuntu、Centosで動作する必要があるため、$ PATHを使用したいと思います。一部は、ルート化されていないシステムのホームディレクトリにインストールでき、一部はインストールされておらず、他の一部はシステムパスにインストールされます。

答え1

使用type commandnamecommandnameエイリアス、関数、組み込み、外部コマンド(検索$PATH)などの実行可能ファイルがある場合はtrueを返します。または以下を使用してください。command commandnamecommandname組み込みコマンドまたは外部コマンド(照会)の場合はtrueを返します$PATH

exists () {
  type "$1" >/dev/null 2>/dev/null
}

常にゼロを返すか返さないいくつかのshバリアント(確かにPOSIX以前、/bin/shOSF1 ≤3.xで見つかったAlmquistシェルのいくつかのバージョンと、初期のNetBSDバージョンといくつかの20世紀のLinuxディストリビューションを知っています)があります。type私は今世紀にこのようなシステムが提供されていないと思います。その項目が見つかったら、$PATH以下を使用して手動で検索できます。

exists () { (
    IFS=:
    for d in $PATH; do
      if test -x "$d/$1"; then return 0; fi
    done
    return 1
) }

$PATH.command -v、POSIXには比較的新しい追加ですが(POSIX:2004ではまだオプションです)。基本的にはプログラマに優しいバージョンですtype。実行可能ファイルのフルパス$PATH、組み込み関数または関数の名前、エイリアスのエイリアス定義を印刷します。

exists_in_path () {
  case $(command -v -- "$1") in
    /*) return 0;;
    alias\ *) return 1;; # alias
    *) return 1;; # built-in or function
  esac
}

Ksh、bash、およびzshもtype -p.bash$PATHで組み込みまたは関数を使用している場合、実行可能ファイルをテストするために戻り状態はtype -p foo0です。出力が空でないことを確認する必要があります。たとえば、POSIXにはありません。 DebianのAsh(Ubuntu)にはありません。foo$PATHtype -p/bin/sh

答え2

単に外部プログラムを探している場合は、whichを使用することもできます。ただ、携帯性がどれほど良いかはよくわかりません。

関連情報