Embora a solução aceita por terdon ♦ seja breve e bonita, gostaria de sugerir algo como:
cmd_exists() {
(
unalias "" 2>/dev/null
status=$(command -v "")
case $status in
*"") echo " found at $status";;
"") echo "Could not find . Aborting."; return 127;;
*) echo "Error: $status" >&2; return 1;;
esac
)
}
cmd_exists gpg
Ele lida com dois casos não tratados pelo outro método aqui:
-
Aliases: eles podem ocultar um executável, mas minha função fornece o caminho real para o executável somente se houver um. Os outros métodos fornecerão a definição de alias e retornarão um código de saída zero, independentemente de existir ou não um comando real.
-
Melhor tratamento de erros: O código de saída 127 representa o tipo de erros "Comando não encontrado", portanto você pode ter um tratamento de erros separado para quando um comando não for encontrado e quando algum outro erro ocorrer.
Se houver algum erro imponderável (ou seja, um erro desconhecido, exceto se o comando não for encontrado), ele não o ocultará, levando você a pensar que gpg
não existe quando isso ocorrer. Se você quiser descartar esses erros, chame assim:
cmd_exists gpg 2>/dev/null
Notas:
Com relação aos aliases, isso pode ou não ser o que você deseja, por exemplo, Saber que um alias existe pode ser o suficiente para você.
Unalias acontece dentro de um subshell, então não atrapalha os aliases do seu shell de trabalho.
Em relação ao tratamento de erros, não sou especialista em scripts de shell, portanto, não saberia qual seria a probabilidade de erro nessa situação nem se há uma maneira melhor de lidar com eles.
Então, cuidado, isso pode ser um exagero.