Eu preciso encontrar o caminho de um determinado programa no PATHusando um script de shell. O caminho deve ser o caminho completo real do programa, que pode ser passado posteriormente para uma das exec*funções que não pesquisa por PATHsi só, por exemplo execv.
Existem programas como o killque estão disponíveis como um programa real e um shell embutido ao mesmo tempo. Se for esse o caso, preciso do caminho completo para o programa real.
Existem vários utilitários que podem encontrar um programa PATHconforme especificado na Seção 2.9.1.1, Pesquisa de comando e execução do padrão POSIX .
Existe which, o que não faz parte de nenhum padrão. Pode ser um programa regular em alguns sistemas, enquanto alguns shells fornecem que é um componente interno. Parece estar disponível na maioria dos sistemas e shells, mas os shells com uma versão interna também retornam apenas o nome do built-in em vez do caminho para o executável. Também não é padronizado de forma alguma e pode retornar qualquer saída e ter opções diferentes.
bash# which kill
/usr/bin/kill
dash# which kill
/usr/bin/kill
fish# which kill
/usr/bin/kill
mksh# which kill
/usr/bin/kill
tcsh# which kill
kill: shell built-in command.
zsh# which kill
kill: shell built-in command
Existe whence, que é um built-in de algumas conchas. Mas não está disponível em muitas conchas. Também retornará o nome do built-in em vez do caminho para o programa. A -ppode ser passado para onde alterar esse comportamento.
bash# whence kill
bash: whence: command not found
dash# whence kill
dash: 1: whence: not found
fish# whence kill
fish: Unknown command 'whence'
mksh# whence kill
kill
mksh# whence -p kill
/usr/bin/kill
tcsh# whence kill
whence: Command not found.
zsh# whence kill
kill
zsh# whence -p kill
/usr/bin/kill
Existe o commandbuilt-in especificado por POSIX: 2008 . Infelizmente, ele também procura comandos regulares e embutidos e retornará o nome do embutido em vez do caminho para o programa sombreado por um embutido com o mesmo nome. Algumas conchas antigas ainda não foram implementadas.
bash# command -v kill
kill
dash# command -v kill
kill
fish# command -v kill
/usr/bin/kill
mksh# command -v kill
kill
tcsh# command -v kill
command: Command not found.
zsh# command -v kill
kill
realpath
enableé fornecido apenas por bashezsh
type -p. Tanto o bash quanto o dash permitem dizer o commandcomando para executar um executável real, mesmo se houver uma função ou um builtin com o mesmo nome.
commandignora funções (e aliases), mas NÃO está embutido, como o Q diz corretamente. E você nem sempre pode usar um shebang porque não há caminho que obtenha um shell específico, ou mesmo algum shell POSIX, em todos os sistemas.
enableestá especificado no POSIX ou não, mas se estiver, você pode usarenable -n whichpara desativar o shell interno dowhich.