O Bash tem o comando interno "type", que indica como cada argumento seria interpretado se usado como um nome de comando, por exemplo:
$ type myfunction
myfunction is a function
myfunction ()
{
echo hello
}
$ type myfunctionalias
myfunctionalias is aliased to `myfunction'
$ type python
python is /usr/bin/python
No último caso, /usr/bin/python é um link, e seu alvo é novamente um link:
$ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 7 Feb 5 09:05 /usr/bin/python -> python3
$ ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 7 Feb 5 09:05 /usr/bin/python -> python3.13
$ ls -l /usr/bin/python3.13
-rwxr-xr-x 1 root root 14352 Feb 5 09:05 /usr/bin/python3.13
É possível resolver um link com "readlink -f", porém é tedioso fazê-lo manualmente, pois requer até três etapas: type para resolver a origem do alias, type para resolver o destino do alias e readlink para resolver qualquer link.
Na prática, estou mais interessado no que realmente será executado, em vez de etapas de resolução únicas. Então, preciso de uma ferramenta do tipo "tipo" que resolva os aliases e os links, idealmente:
$ clevertype python
/usr/bin/python3.13
$ clevertype --verbose python
python is /usr/bin/python
/usr/bin/python links to /usr/bin/python3
/usr/bin/python3 links to /usr/bin/python3.13
Result: python resolves to /usr/bin/python3.13
E:
$ clevertype pythonalias
pythonalias resolves to /usr/bin/python3.13
$ clevertype --verbose pythonalias
pythonalias is aliased to `/usr/bin/python'
/usr/bin/python links to /usr/bin/python3
/usr/bin/python3 links to /usr/bin/python3.13
Result: pythonalias resolves to /usr/bin/python3.13
Existe tal ferramenta?
Supondo que não haja uma solução pronta para uso, expandi a resposta de Jukka Matilainen para incluir a resolução de aliases, recursão e imprimir as etapas.
Isso fornece a seguinte saída:
Pode haver casos patológicos em que não funciona, pois tenta imitar comportamentos complexos do bash e do sistema operacional. Por exemplo, "ls" é frequentemente um alias para "ls [options]", como pode ser visto no último exemplo. Pode não funcionar se o comando tiver espaços.
Você pode construir isso sozinho: você pode usar
readlink
ourealpath
para resolver os links recursivamente.Colocar tudo isso em uma função Bash poderia ser algo assim:
Esta é minha opinião sobre o que você está pedindo:
No meu Mac,
llt ls
as saídas são:O inicial
printf
criará uma linha com base notype -ta $1
ie.aliasfilefile
Cada teste da instrução case executará o teste e;;&
dirá à instrução case para continuar no próximo teste (então o exemplo atingirá oalias
teste e ofile
teste.Esqueci de mencionar se o comando é um alias ou função, eu produzo o conteúdo desse alias ou função