Como funciona o preenchimento da guia bash?

113

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?

CamelBlues
fonte
2
Você pode querer verificar /etc/bash_completion(pelo menos, é aí que está grande parte da magia do Debian).
Wrikken
1
@Wrikken: Isso é bash_completion, que depende do preenchimento da guia, mas não exatamente como isso acontece.
Ignacio Vazquez-Abrams,

Respostas:

101

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 completeum 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 sudiz ao completar um argumento para o sucomando, 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_completionconté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.

Paŭlo Ebermann
fonte
1
As páginas de manual existem apenas para comandos independentes, não para comandos internos de shell. Mas faz parte do manual do bash que vinculei.
Paŭlo Ebermann
7

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

fixje
fonte