Eu encontrei
which alias
ouwhich compgen
etc não retorna nada.
Ambos são construídos em shell. which
não sabe nada sobre shell builtins: ele simplesmente procura um caminho para executáveis.
Para um resultado mais confiável, use type
.
$ type compgen
compgen is a shell builtin
$ type alias
alias is a shell builtin
type
tem melhor conhecimento do que é executado porque é um shell embutido.
Por que which
não é confiável
which
geralmente fornece a resposta errada. Observe:
$ type pwd
pwd is a shell builtin
$ which pwd
/bin/pwd
Quando você executar pwd
, sem especificar um caminho explícito, o shell executará seu builtin, não o executável que which
encontrou.
Aqui estão mais exemplos de which
dando a resposta errada:
$ type echo
echo is a shell builtin
$ which echo
/bin/echo
$ type [
[ is a shell builtin
$ which [
/usr/bin/[
Observe:
$ type /bin/echo
/bin/echo is /bin/echo
Quando você fornece um caminho explícito para echo
, como /bin/echo
, então o shell executaria esse executável, não o interno. type
sabe disso também, como você pode ver acima.
Como which
funciona internamente
Em sistemas parecidos com o debian, which
é um shell script simples, cuja parte relevante é:
for ELEMENT in $PATH; do
if [ -z "$ELEMENT" ]; then
ELEMENT=.
fi
if [ -f "$ELEMENT/$PROGRAM" ] && [ -x "$ELEMENT/$PROGRAM" ]; then
puts "$ELEMENT/$PROGRAM"
RET=0
[ "$ALLMATCHES" -eq 1 ] || break
fi
done
Como você pode ver, ele faz uma pesquisa simples ao longo do PATH para um arquivo executável do nome dado.