Use type commandname. Isso retorna true se commandnamehouver algo executável: alias, função, comando interno ou externo (consultado $PATH). Como alternativa, use o command commandnameque retorna true se commandnamefor um comando interno ou externo (consultado $PATH).
exists () {
type "$1" >/dev/null 2>/dev/null
}
Existem algumas variantes sh (definitivamente pré-POSIX; eu conheço o /bin/shOSF1 ≤3.xe algumas versões do shell Almquist encontradas nas versões iniciais do NetBSD e algumas distribuições Linux do século XX), onde typesempre retorna 0 ou não existir. Eu não acho que nenhum sistema enviado com estes neste milênio. Se você os encontrar, aqui está uma função que você pode usar para pesquisar $PATHmanualmente:
exists () { (
IFS=:
for d in $PATH; do
if test -x "$d/$1"; then return 0; fi
done
return 1
) }
Essa função geralmente é útil se você deseja excluir funções e recursos internos e procurar o nome $PATH. A maioria dos shells possui um built-in para isso, command -vembora seja uma adição relativamente recente ao POSIX (ainda opcional a partir do POSIX: 2004). É basicamente uma versão amigável do programador type: imprime o caminho completo de um executável $PATH, o nome simples de um built-in ou função e uma definição de alias para um alias.
exists_in_path () {
case $(command -v -- "$1") in
/*) return 0;;
alias\ *) return 1;; # alias
*) return 1;; # built-in or function
esac
}
Ksh, bash e zsh também precisam type -pprocurar apenas executáveis no $PATH. Observe que, no bash, o status de retorno type -p fooé 0 se foofor uma função ou função interna; se você quiser testar um executável $PATH, precisará verificar se a saída não está vazia. type -pnão está no POSIX; por exemplo, o ash do Debian (que está /bin/shno Ubuntu) não o possui.