コマンドが実際に存在するかどうかを、スクリプトで調べたい。
bashやrubyでシェルスクリプトを書くときにコマンドが存在するかを事前チェックしてテストを充実させたい。
コマンドが存在するか調べるには
type pdtfk
のようにします。
bashでコマンド存在判別をやると
if [ -x "`which pdftk `" ]; then echo "コマンドがある" fi
which だといまいちだと思うのでtypeを使いますね。
if type aaals 2>/dev/null 1>/dev/null then echo exists fi
ruby スクリプトでやるばあい
ruby でやるにはいろいろ考えられるんですが
typeコマンド実行結果のステータスで判別。
type コマンドは、実行結果をステータスコードで返します。
- コマンドが存在した ⇛ 正常終了 0
- コマンドが存在しない ⇛ エラー終了 0 以外
になります。コレで判別が可能です。
ret = ` type lsa 2> /dev/null` if $?.exitstatus == 0 then puts "存在" else puts "非実在" end
さらにTypeコマンドの性質を活かせば
typeコマンドが標準エラーと標準出力を使い分けるので
- コマンド存在した ⇛ 標準出力 にメッセージ
- コマンドが存在しない ⇛ エラー出力 にメッセージ
という、出力性質に着目すると。スクリプトは
最後に再利用できるように関数化
def cmd_exists?( name ) ;` type "#{name}" 2> /dev/null`; $?.exitstatus == 0 ; end alias cmd_exists cmd_exists?
Qiitaにでも放り投げておきます。
2014-08-08 修正
cmd_exists? の判定が抜けてたので修正