Para listar todos os comandos disponíveis, incluindo aliases, funções, bash builtins e bash keywords, use compgen -c
. Você pode grep
da lista resultante com qualquer padrão, por exemplo:
compgen -c | grep 'ctl$'
Então eu posso inserir systemc
e pressionar Tab e obter systemctl
.
Mas e se eu quiser listar todos os comandos que terminam em ctl
?
Como eu faria isso?
Para listar todos os comandos disponíveis, incluindo aliases, funções, bash builtins e bash keywords, use compgen -c
. Você pode grep
da lista resultante com qualquer padrão, por exemplo:
compgen -c | grep 'ctl$'
Se você usar apropos ctl | less
, verá todos os comandos que contêm a string ctl, que inclui as páginas man. Ele também exibirá alguns outros contendo essa string, mas surpreendentemente há alguns desses resultados não intencionais, então você pode achar bastante útil.
Não há nada que o impeça de pesquisar o $PATH
dos arquivos correspondentes
( IFS=:; for p in $PATH; do ls -d "$p"/*ctl; done ) 2>/dev/null
Eu usei um subshell ( ... )
porque estou alterando a variável do shell IFS
. Uma alternativa seria salvá-lo no início ( OIFS="$IFS" IFS=:
) e restaurá-lo depois ( IFS="$OIFS"
), mas para mim isso parece um pouco menos robusto.
Eu faria isso usando find
:
( IFS=:; for dir in $PATH; do find $dir/ -type f -executable -iregex ".*ctl"; done )
Para mostrar apenas o cmd:
( IFS=:; for dir in $PATH; do find $dir/ -type f -executable -iregex ".*ctl" -printf '%f\n'; done ) 2>/dev/null