O preenchimento automático para aplicativos feitos pelo shell?

1

Quando eu digito evince e depois clico em tab, o bash shell listará todos os arquivos que podem ser abertos por evince , que parece ser baseado na parte ext do nome do arquivo.

Isso é feito por shell ou pelo aplicativo evince ?

Se anterior, como o shell sabe o que o aplicativo precisa?

    
por Tim 10.09.2014 / 04:38

1 resposta

2

Executa no shell

Há duas perguntas separadas aqui:

Onde está a conclusão implementada e Qual outro componente de software pertence a ?

A implementação da conclusão está interagindo de perto com o editor de linha de comando, que faz parte do shell; Basicamente, precisa ser executado no shell.

Uma grande parte da conclusão é implementada como funções do shell na maioria dos shells;

Pacote separado

Você perguntou se é de alguma forma parte do aplicativo ou parte do shell; Na prática, não é nem o primeiro nem o segundo, na verdade, mas independente.

A maioria das conclusões no Ubuntu está no pacote separado bash-completion , uma grande coleção das conclusões que você poderia esperar.
Não faz parte do bash, mas é gerenciado e liberado de forma independente.

Código

Vamos dar uma olhada no seu exemplo de conclusão de evince :

$ apt-file list bash-completion | grep evince
bash-completion: /usr/share/bash-completion/completions/evince
$ ls -l /usr/share/bash-completion/completions/evince
-rw-r--r-- 1 root root 967 Apr  7 16:10 /usr/share/bash-completion/completions/evince

Interessante! Não precisamos procurar algo geral como conclusão para visualizadores de PDF, mas encontramos algo diretamente relacionado a evince .

O arquivo contém uma implementação da função shell; Parte dele consiste em constantes de string que descrevem como evince pode ser usado na linha de comando - as partes mais interessantes de /usr/share/bash-completion/completions/evince são:

_evince() {
    [  ...  ]
    case $prev in --gdk-no-debug|--gtk-module|--gtk-debug|--gtk-no-debug|\
        -p|--page-label|-i|--page-index|-l|--find|--display)
    [  ...  ]
    _filedir '@(@(?(e)ps|?(E)PS|[pf]df|[PF]DF[...]|bmp|xpm|ico|xwd|tga|pcx)'
    [  ...  ]

Ele descreve opções gerais como --gtk-debug , opções específicas do aplicativo como --page-label e lista extensões de nome de arquivo que podem ser pagas por evince como .eps e .pdf .

Hands on

Você pode mostrar as funções definidas no shell atual com o declare builtin. Se você tentar isso em um novo shell, receberá uma mensagem de erro:

$ declare -f -p _evince
bash: declare: _evince: not found

Assumindo que o pacote bash-completion esteja instalado, isso apenas mede que a função ainda não está carregada.
Como há um grande número de funções como esta, e em uma sessão de shell interativa, apenas algumas são usadas, faz sentido carregar somente funções quando elas são realmente necessárias, em vez de carregar tudo na inicialização .

Para obter a função carregada, tentamos usá-la usando a evince completion. Com o cursor na localização de | , pressione a tecla Tab ;

$ evince -|<TAB>

Pode haver alguma conclusão mostrada. Agora, a função deve ser carregada e ter a aparência no arquivo acima, se for impressa:

$ declare -f -p _evince

Para listar todos os nomes de funções, ou ver todas as funções que estão atualmente carregadas - incluindo aquelas que não estão relacionadas à conclusão, use:

$ declare -F | less
$ declare -f | less
    
por 10.09.2014 / 06:27