コマンドの存在を確認する方法

コマンドが使えるかどうかを確認するシェルスクリプトを作成しました。

実行すると、こういう出力を返してくれます。

 vi         = True (/bin/vi)
 cmake      = True (/usr/local/cmake/bin/cmake)
 ifconfig   = True (/sbin/ifconfig)
 reboot     = True (/usr/bin/reboot)
 asdf       = False

2つの方法があります。

環境変数PATHを使う方法
一つ目は、環境変数PATHの中を捜す方法。これはシンプルで正統的な方法ですが、aliasでパスを通している場合に見つからないという欠点があります。

commandCheckFromPath.sh

#!/bin/bash

function checkCmd() {
  cmd=$1
  IFS=:
  for d in $PATH; do
    if [ -x $d/$cmd ]; then
      #echo "$d/$cmd"
      echo 0
      exit
    fi
  done
  echo 1
}

function printCmd() {
  cmd=$1
  printf " %-10s = " ${cmd}
  if [ `checkCmd ${cmd}` -eq 0 ]; then
    echo "True (`which ${cmd}`)"
  else
    echo "False"
  fi
}

cmds=(
vi
cmake
ifconfig
reboot
asdf
)

for c in ${cmds[@]}; do
  printCmd $c
done

whichの終了コードを使う方法
二つ目の方法は、whichコマンドの終了コードを確かめる方法。whichコマンドを使うとそのコマンドが使えるかどうかを確認してくれますが、コマンドがなかった場合は終了コードが1になるようです。その仕組みを利用してシェルスクリプト内でコマンドの存在可否を確かめます。

#!/bin/bash
cmds=(
vi
cmake
ifconfig
reboot
asdf
)

for c in ${cmds[@]}; do
  which $c >& /dev/null
  rst=$?
  printf " %-10s = " $c
  if [ ${rst} == 0 ]; then
    path=`which $c`
    echo "True ($path)"
  else
    echo "False"
  fi
done

私の環境ではどちらのコードも同じ結果になりました。