09 December 2012

シェルスクリプトでコマンドの有無を確かめる

which を使う

最初に思いついた方法.

if [ `which SOME_COMMAND` ]; then
    echo 'found'
fi

# 一行で
which SOME_COMMAND > /dev/null 2>&1 && echo 'found'

type を使う

OSに付属するシェルスクリプトを読んで技術を盗む(1/2) - @IT で紹介されていた方法. コマンドは違うが考え方は上記と同じ.

if type logger > /dev/null 2>&1; then
        LOGGER="logger -s -p user.notice -t dhclient"
else
        LOGGER=echo
fi

command -v を使う

rvm がこういうふうにやっていた. なぜ builtin command というふうにわざわざやっているのかがよくわからない. command っていうコマンドがビルトイン以外にもあってかぶるケースがあるのかな.

__rvm_sha256_for()
{
  if builtin command -v sha256sum > /dev/null ; then
    echo "$1" | sha256sum | awk '{print $1}'
  elif builtin command -v sha256 > /dev/null ; then
    echo "$1" | sha256 | awk '{print $1}'
  elif builtin command -v shasum > /dev/null ; then
    echo "$1" | shasum -a256 | awk '{print $1}'
  else
    rvm_error "Neither sha256sum nor shasum found in the PATH"
    return 1
  fi

  return 0
}

rvm/scripts/functions/rvmrc at master · wayneeseguin/rvm · GitHub