Differences between revisions 4 and 5
Revision 4 as of 2007-05-13 11:58:24
Size: 1500
Editor: BetterWorld
Comment:
Revision 5 as of 2007-05-13 15:37:29
Size: 1659
Editor: GreyCat
Comment: clean-up
Deletions are marked like this. Additions are marked like this.
Line 18: Line 18:
x=$(LC_ALL=C which qwerty 2>&1) # Backticks here because we're assuming a legacy Bourne shell.
x=`LC_ALL=C which qwerty 2>&1`
Line 27: Line 28:
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.
Line 29: Line 32:
if ! which qwerty 2>/dev/null; then if ! which qwerty >/dev/null 2>&1; then
Line 35: Line 38:
(Also 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.}}}; and on Debian and Suse, it prints nothing at all. On Gentoo, it actually prints something to stderr.) (Although, on a GNU system, one would generally prefer to use one of the Bash builtins instead.)

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 does not set a useful exit code (on any system but GNU/Linux) -- and it doesn't even write errors to stderr! Therefore, one must parse its output.

# Last resort -- using which(1)
# Backticks here because we're assuming a legacy Bourne shell.
x=`LC_ALL=C which qwerty 2>&1`
case "$x" in
  no\ *\ in\ *)           echo qwerty does not exist;;
  *Command\ not\ found.)  echo qwerty does not exist;;
  '')                     echo qwerty does not exist;;
  *)                      echo qwerty exists;;
esac

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.)

BashFAQ/081 (last edited 2023-05-22 10:02:19 by emanuele6)