Anchor(faq81)

How can I determine whether a command exists anywhere in my PATH?

In BASH, there are a couple builtins that are suitable for this purpose: hash and type. Here's an example using hash:

if hash qwerty 2>/dev/null; then
  echo qwerty exists
else
  echo qwerty does not exist
fi

If these builtins are not available (because you're in a Bourne shell, or whatever), then you may have to rely on the external command which (which is often a csh script, although sometimes a compiled binary). Unfortunately, which may no set a useful exit code on systems other than GNU/Linux -- and it may not even write errors to stderr. In those cases, one must parse its output.

# Last resort -- using which(1)
# Backticks + unset (no "local" used for variable); assume a legacy Bourne shell.
function Which()
{
    [ "$1" ] || return 1     # Require ARG

    tmpval=`LC_ALL=C which $1 2>&1`

    case "$tmpval" in
      *no\ *\ in\ *) tmpval="" ;;
      *not\ found*)  tmpval="" ;;
      '')            tmpval="" ;;
    esac

    if [ "$tmpval" ]; then
        echo $tmpval
        unset tmpval    # prevent variable leak from function
        return 0
    else
        unset tmpval
        return 1
    fi
}

Which which

Note that its output is not consistent across platforms. On HP-UX, for example, it prints no qwerty in /path /path /path ...; on OpenBSD, it prints qwerty: Command not found.; on Debian and SuSE, it prints nothing at all; and on Gentoo, it actually prints something to stderr.

# Another easy way that works only on gnu:
if ! which qwerty >/dev/null 2>&1; then
  echo "$0: install qwerty first"
  exit 1
fi

(Although, on a GNU system, one would generally prefer to use one of the Bash builtins instead.)