Este é Bash. O comportamento é semelhante em peixes.
$ which python
/usr/bin/python
$ alias py=python
$ type py
py is aliased to `python'
E então, correr type -P py
não imprime nada, onde eu esperava imprimir /usr/bin/pyton
de forma semelhante ao que é visto abaixo.
$ type ls
ls is aliased to `ls --color=auto'
$ type -P ls
/bin/ls
A documentação para a -P
opção lê
-P force a PATH search for each NAME, even if it is an alias,
builtin, or function, and returns the name of the disk file
that would be executed
Confirmei que /usr/bin
(o diretório onde python
está localizado) está em PATH
.
O que está acontecendo aqui?
Este:
não significa que o bash expandirá o alias e, em seguida, procurará o comando expandido. Isso significa que, se houver um comando
foo
, e também um aliasfoo
,type -P foo
ele ainda procurará o comando chamadofoo
, mesmo que haja um alias mascarando-o. Portanto, o bash não está se expandindopy
paratype -P py
serpython
e não será exibido/usr/bin/python
.O que está acontecendo é que seu shell está procurando por um binário nomeado
py
em cada diretório em seuPATH
, e não encontra nenhum.type -P
não interpreta aliases ou funções; ele força o nome dado a ser pesquisado no caminho, ignorando qualquer outro comando disponível que não seja do tipo “arquivo” com o mesmo nome.(Há uma sutileza adicional com
type -p
andtype -P
: eles levam em consideração os hashes, então eles mostrarão um valor de hash se existir, sem olhar noPATH
. Mas isso não está envolvido aqui.)