Aqui está uma função que lista o conteúdo dos diretórios $PATH . Se passado argumentos, a função só lista comandos cujo nome contenha um dos argumentos. Os argumentos são interpretados como padrões glob.
shopt -s extglob
lspath () {
local IFS pattern
IFS='|'
pattern="*@($*)*"
IFS=':'
for d in $PATH; do
for x in "$d/"$pattern; do
[ "$x" = "$d/$pattern" ] || echo "${x##*/}"
done
done | sort -u
}
Como muitas outras coisas, isso é mais fácil em zsh.
lspath () {
(($#)) || set ''
print -lr -- $^path/*$^@*(N:t) | sort -u
}
O caractere ^ na expansão de parâmetro faz com que o texto concatenado com a matriz para ser adicionado a cada elemento da matriz, por exemplo path=(/bin /usr/bin); echo $^path/foo imprime /bin/foo /usr/bin/foo .
/*$^@* parece um insulto de quadrinhos, mas na verdade é o caractere comum / , o caractere curinga * , o parâmetro especial $@ (a matriz do parâmetro posicional) com o modificador ^ e novamente * .
(N:t) é o glob qualificador N para obter uma expansão vazia se não houver correspondência seguida pelo modificador de histórico t para manter apenas o nome da base ("tail") de cada correspondência.
Mais enigmático, evita a chamada externa, mas isso é apenas de interesse cosmético:
lspath () {
(($#)) || set ''
local names; names=($^path/*$^@*(N:t))
print -lr -- ${(ou)names}
}
Você pode, de fato, estar procurando o comando apropos , que pesquisa por páginas man de comandos cujo descrição curta contém uma palavra-chave. Uma limitação é que isso só encontra comandos que tenham uma página man.