それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

シェルにコマンドが存在するか調べる

コマンドが実際に存在するかどうかを、スクリプトで調べたい。

bashrubyシェルスクリプトを書くときにコマンドが存在するかを事前チェックしてテストを充実させたい。

コマンドが存在するか調べるには

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 コマンドは、実行結果をステータスコードで返します。

  1. コマンドが存在した ⇛ 正常終了 0
  2. コマンドが存在しない ⇛ エラー終了 0 以外

になります。コレで判別が可能です。

ret = ` type lsa 2> /dev/null`
if $?.exitstatus  == 0 then
    puts "存在"
else
    puts "非実在"
end

さらにTypeコマンドの性質を活かせば

typeコマンドが標準エラーと標準出力を使い分けるので

  1. コマンド存在した ⇛ 標準出力 にメッセージ
  2. コマンドが存在しない ⇛ エラー出力 にメッセージ

という、出力性質に着目すると。スクリプト

ruby でコマンドの存在を調べる、
if ` type NO_EXIST_COMAND 2> /dev/null` != "" then
    puts "存在"
else
    puts "非実在"
end

上記のように、少しシンプルになります。こちらも良いでしょうね。

勿論、コマンドの存在は、PATH環境変数に依存するので、PATH調べてもいいんですけどね。面倒だよね。

最後に再利用できるように関数化

def cmd_exists?( name ) ;` type "#{name}" 2> /dev/null`; $?.exitstatus == 0  ; end
alias cmd_exists cmd_exists?


Qiitaにでも放り投げておきます。

2014-08-08 修正

cmd_exists? の判定が抜けてたので修正