Eu encontrei
which aliasouwhich compgenetc 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.