Uma função acessível por fpath
não "existe" no sentido em que pode ser invocada. Ele deve ser carregado automaticamente primeiro, após o qual which
(e qualquer outro método para testar a existência de uma função) reportará uma definição de stub que carrega automaticamente a definição real.
% zargs
zsh: command not found: zargs
% autoload zargs
% which zargs
zargs () {
# undefined
builtin autoload -X
}
which foo
teste com precisão se foo
pode ser usado como um nome de comando, exceto por qualquer que seja o command_not_found_handler
. Como command_not_found_handler
pode conter código arbitrário, não há como prever o que isso fará; e como ele executa o comando substituto se encontrar um, não há como verificar o que ele faria sem executar nada.
Se o seu código for específico de zsh, você pode usar whence
em vez de which
(ou whence -w
para obter saída terser, não há nenhuma opção para torná-lo silencioso), que é um wrapper em torno de whence
. Se você quiser que seu código seja utilizável em outros shells ao estilo Bourne / POSIX, use type
, não which
.
function exists {
whence -w $1 >/dev/null
}
Se a sua definição de "existir" inclui funções que podem ser carregadas automaticamente, mas ainda não estão implementadas, implemente código que detecte funções que possam ser carregadas automaticamente, mas que ainda não estejam: traverse $fpath
explicitamente.