Tenho passado muito tempo no shell recentemente e estou me perguntando como funciona o preenchimento automático da guia. Qual é o mecanismo por trás disso? Como o bash conhece o conteúdo de cada diretório?
bash
shell
autocomplete
CamelBlues
fonte
fonte
/etc/bash_completion
(pelo menos, é aí que está grande parte da magia do Debian).Respostas:
Existem duas partes para o preenchimento automático:
A biblioteca readline, como já mencionado pelo fixje, gerencia a edição da linha de comando e retorna ao bash quando a guia é pressionada, para habilitar a conclusão. O Bash então fornece (veja o próximo ponto) uma lista de conclusões possíveis, e readline insere tantos caracteres quantos forem identificados sem ambigüidade pelos caracteres já digitados. (Você pode configurar bastante a biblioteca readline, veja a seção Edição de linha de comando do Bash manual para detalhes.)
O próprio Bash tem
complete
um mecanismo integrado para definir um mecanismo de conclusão para comandos individuais. Se para o comando corrente não se definiu nada, se utilizava a complementação por nome de arquivo (utilizando opendir / readdir, como disse Ignacio).A parte para definir suas próprias conclusões é descrita na seção Conclusão programável . Em suma, com
complete «options» «command»
você define a conclusão de algum comando. Por exemplo,complete -u su
diz ao completar um argumento para osu
comando, procure por usuários do sistema atual .Se isso for mais complicado do que as opções normais podem cobrir (por exemplo, conclusões diferentes dependendo do índice do argumento, ou dependendo dos argumentos anteriores), você pode usar o
-F function
, que irá então chamar uma função shell para gerar a lista de conclusões possíveis. (Isso é usado, por exemplo, para completar o git, que é muito complicado, dependendo do subcomando e às vezes das opções fornecidas, e às vezes usando nomes de branches (que não são conhecidos pelo bash).Você pode listar as conclusões existentes definidas em seu ambiente bash atual usando simplesmente
complete
, para ter uma impressão do que é possível. Se você tiver o pacote bash-completed instalado (ou como quer que seja nomeado em seu sistema), conclusões para muitos comandos são instaladas e, como disse o Wrikken,/etc/bash_completion
contém um script bash que é freqüentemente executado na inicialização do shell para configurar isso. Scripts de conclusão personalizados adicionais podem ser colocados/etc/bash_completion.d
; esses são todos provenientes de/etc/bash_completion
.fonte
Se você estiver interessado no básico: Bash usa readline, que apresenta histórico e completamento básico. Você pode inspecionar a fonte se quiser obter uma compreensão detalhada. Além disso, você pode usar readline para construir suas próprias interfaces CLI com conclusão
fonte