sh
すべての起動/環境スクリプトを書いて、できるだけ使いたいと思います。乾いたそしてできるだけ多く:「私が複製したすべての* nixで動作します。」これは、存在しないコードを実行しようとすると、コードが正常に失敗することを確認することを意味します。これを行うには、プログラムが存在するかどうかをテストできる必要があります。ファイルが存在するかどうかをテストする方法を知っていますが、そのパスでアプリケーションが実行可能かどうかをテストする方法がわかりません。これらのいくつかはアーチ、Ubuntu、Centosで動作する必要があるため、$ PATHを使用したいと思います。一部は、ルート化されていないシステムのホームディレクトリにインストールでき、一部はインストールされておらず、他の一部はシステムパスにインストールされます。
答え1
使用type commandname
。commandname
エイリアス、関数、組み込み、外部コマンド(検索$PATH
)などの実行可能ファイルがある場合はtrueを返します。または以下を使用してください。command commandname
commandname
組み込みコマンドまたは外部コマンド(照会)の場合はtrueを返します$PATH
。
exists () {
type "$1" >/dev/null 2>/dev/null
}
常にゼロを返すか返さないいくつかのshバリアント(確かにPOSIX以前、/bin/sh
OSF1 ≤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 foo
0です。出力が空でないことを確認する必要があります。たとえば、POSIXにはありません。 DebianのAsh(Ubuntu)にはありません。foo
$PATH
type -p
/bin/sh
答え2
単に外部プログラムを探している場合は、whichを使用することもできます。ただ、携帯性がどれほど良いかはよくわかりません。