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/foo
impressõ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 apropos
comando, 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
?