Utilisez type commandname
. Cela retourne vrai si commandname
quelque 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 commandname
est 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/sh
sous 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 $PATH
manuellement:
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 -v
bien 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 -p
rechercher uniquement les exécutables dans $PATH
. Notez qu'en bash, le statut de retour type -p foo
est 0 s'il foo
s'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 -p
n'est pas dans POSIX; par exemple, la cendre de Debian (qui est /bin/sh
sur Ubuntu) ne l'a pas.