Utilisez type commandname. Cela retourne vrai si commandnamequelque chose est exécutable: alias, fonction, commande intégrée ou externe (recherchée dans $PATH). Vous pouvez également utilisercommand commandname qui renvoie true si commandnameest une commande intégrée ou externe (recherchée dans $PATH).
exists () {
  type "$1" >/dev/null 2>/dev/null
}
Il y a quelques variantes sh (certainement pré-POSIX; je connais /bin/shsous OSF1 ≤3.x et certaines versions du shell Almquist trouvées dans les premières versions de NetBSD et quelques distributions Linux du 20e siècle) oùtype renvoie toujours 0 ou non exister. Je ne pense pas que des systèmes soient livrés avec ceux-ci ce millénaire. Si vous les rencontrez, voici une fonction que vous pouvez utiliser pour rechercher $PATHmanuellement:
exists () { (
    IFS=:
    for d in $PATH; do
      if test -x "$d/$1"; then return 0; fi
    done
    return 1
) }
Cette fonction est généralement utile si vous souhaitez exclure les fonctions intégrées et rechercher le nom dans $PATH. La plupart des shells ont une fonction intégrée pour cela, command -vbien qu'il s'agisse d'un ajout relativement récent à POSIX (toujours facultatif à partir de POSIX: 2004). Il s'agit essentiellement d'une version conviviale de type: il affiche le chemin complet d'un exécutable dans $PATH, le nom nu pour une fonction intégrée ou, et une définition d'alias pour un alias.
exists_in_path () {
  case $(command -v -- "$1") in
    /*) return 0;;
    alias\ *) return 1;; # alias
    *) return 1;; # built-in or function
  esac
}
Ksh, bash et zsh doivent également type -prechercher uniquement les exécutables dans $PATH. Notez qu'en bash, le statut de retour type -p fooest 0 s'il foos'agit d'une fonction intégrée ou; si vous souhaitez tester un exécutable dans $PATH, vous devez vérifier que la sortie n'est pas vide. type -pn'est pas dans POSIX; par exemple, la cendre de Debian (qui est /bin/shsur Ubuntu) ne l'a pas.