Mude para zsh . Certifique-se de que seu .zshrc
inclua a linha
setopt glob_complete
Aproveite.
Depois de alguns anos de "BASHing", escrevi vários scripts personalizados. A maioria deles eu não uso diariamente, então é fácil esquecer como os nomeei, o mais consistente que eu poderia tentar ser.
Então eu sei que se eu estou pretendendo executar o meu FLAC2MP3.bat
, eu apenas escrevo FLA
+ TAB TAB , e lá eu tenho uma lista de o que o Bash poderia encontrar no meu $ PATH:
FLAC2MP3.bat FLAC2MP3.bat~ FlashPlayerApp.exe FlashPlayerCPLApp.cpl
É possível fazer o mesmo tipo de pesquisa, mas escrevendo *MP3*
(ou algo similar) para procurar por arquivos que correspondam ao padrão no meu PATH? Quando escrevo isso e pressiono TAB (uma ou duas vezes), basicamente nada acontece.
O que eu já tentei:
find
on %código%. Embora não seja tão prático quanto pressionar TAB , pode ser uma solução. No entanto, eu quase fiquei louco e não tive sucesso com a expansão de variáveis, já que meu PATH (como a maioria dos PATHs do Cygwin) tem espaços em alguns diretórios e a expansão insere aspas simples ao encontrá-las ( $PATH
). Na verdade, perdi muito tempo tentando fazer com que esse trabalho pudesse ser uma questão separada.
ls 'echo $PATH | sed s@ @\ @g | sed s@:@ @g' | grep [string]
cumpra o que precisa, em ambos os aspectos? sed s@ @\ @g
deve substituir $PATH
entradas que possuem espaços nelas com o espaço com escape legível e sed s@:@ @g
deve substituir os dois pontos separando $PATH
entradas por um espaço normal que permite ls
listar individualmente o conteúdo de cada diretório, que pode ser passado para grep
, que reconhece a pesquisa em regex como os curingas que você deseja usar. Isso funciona tanto quanto eu posso dizer no Bash nativo, mas não tenho certeza se ele funcionará no Bash do Cygwin.
Se isso funcionar, você sempre poderá aliasá-lo para que seja menos complicado de usar.
Eu não tenho uma resposta para a sua pergunta principal, mas fiquei curioso sobre o seu segundo item "o que eu já tentei" e até agora o melhor que posso fazer para trabalhar com um único comando, nenhum subshell é :
IFS=: find_path=(${PATH}) && find "${find_path[@]}" <your_find_params>
Isso é feio e prova que o single-command / no-subshell provavelmente não vale o esforço. Por comentário de Stephane abaixo você pode fazer algo como
(IFS=:; set -f; find $PATH <your_find_params>)
Editar: Claro que isso não lida com o caso de uma nova linha incorporada em um componente de caminho, mas quem se importa ... estamos vivendo no mundo real. :)
Tags bash wildcards autocomplete