Como posso encontrar comandos / arquivos no meu PATH por meio da conclusão da tabulação usando curingas?

1

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:

  • Embora não seja idêntica à minha pergunta, tentei as respostas para " Como eu deixo curing autocomplete curingas? ". Eles parecem se relacionar apenas com conclusões sobre o conteúdo atual do diretório, o que não é meu caso.
  • Esta resposta a uma pergunta quase semelhante (mas não envolvendo curingas) pareceu uma boa ideia: usar 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.
por Charles Roberto Canato 04.08.2017 / 15:01

3 respostas

2

Mude para zsh . Certifique-se de que seu .zshrc inclua a linha

setopt glob_complete

Aproveite.

    
por 06.08.2017 / 01:17
1

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.

    
por 04.08.2017 / 16:27
1

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. :)

    
por 04.08.2017 / 16:18