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?
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?
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 o su
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
.
/etc/bash_completion
(pelo menos, é aí que está grande parte da magia do Debian).