Aqui está uma função que lista o conteúdo dos diretórios $PATH. Se passados argumentos, a função lista apenas comandos cujo nome contém 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 coisas, isso é mais fácil no 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 seja adicionado a cada elemento da matriz, por exemplo, path=(/bin /usr/bin); echo $^path/fooimpressões /bin/foo /usr/bin/foo.
/*$^@*parece um insulto à história em quadrinhos, mas na verdade é o caractere comum /, o curinga *, o parâmetro especial $@(a matriz do parâmetro posicional) com o ^modificador e, novamente *.
(N:t)é o qualificador global 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 ("cauda") 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}
}
De fato, você pode estar procurando pelo aproposcomando, que procura por páginas de manual de comandos cuja descrição curta contém uma palavra-chave. Uma limitação é que isso encontra apenas comandos que possuem uma página de manual.
ls -la?