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.