Tabulação-conclusão de padrões de shell

5

Em meus servidores Debian, estou acostumado a pressionar Tab para "visualizar" a expansão de padrões de shell:

$ cp *some*<Tab>
something  somewhat  have-some-cake
$ cp *some*_

Quando o padrão se expande para uma entrada, o Tab substitui o padrão pela entrada real; caso contrário, mostrará uma lista de entradas correspondentes. Isso é intuitivo e útil porque é consistente com a conclusão da guia regular "prefixo".

Mas meus servidores e desktops do Ubuntu se comportam de maneira diferente: mesmo quando se expande para mais de uma entrada, o Tab substitui o padrão pela primeira entrada.

Eu verifiquei os suspeitos usuais (/etc/bash.bashrc, / etc / inputrc e as versões locais) e não encontrei nenhuma diferença.

Alguém sabe qual configuração controla esse comportamento?

    
por Tobia 07.12.2016 / 17:25

2 respostas

1

Ao contrário a outra resposta , este problema específico é provavelmente um resultado direto do uso do bash -completação. O pacote de conclusão do bash tem vários bugs (como indicado em esta resposta U & amp; L sobre um problema semelhante, por exemplo ).

Se eu comentar esta seção no meu .bashrc :

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

e inicie uma nova instância do bash, então recebo:

$ echo *o*<tab><tab>
foo     food    foo.sh  
$ echo *o*

E, em seguida, se eu gerar o script /usr/share/bash-completion/bash_completion como estava no .bashrc :

$ . /usr/share/bash-completion/bash_completion
$ echo foo

O *o* foi imediatamente preenchido automaticamente para foo sem mostrar as outras correspondências.

Estou usando o 16.04, a propósito. Não sei se isso foi corrigido em versões mais recentes.

$ dpkg-query --show --showformat='${Package} ${version}\n' bash bash-completion
bash 4.3-14ubuntu1.2
bash-completion 1:2.1-4.2ubuntu1.1
    
por Olorin 22.11.2017 / 07:34
0

A conclusão mais inteligente da guia no Bash exige o pacote bash-completion .

sudo apt install bash-completion

Conclusão do Bash é escrita e mantida pelo Debian diretamente.
(Veja também o seu pacote Debian e páginas do pacote Ubuntu .

Depois de instalado, ele será carregado automaticamente (por exemplo, via /etc/bash.bashrc ) ou você precisará instruir o Bash a carregá-lo no seu ~/.bashrc com uma estrofe como esta:

if [[ -z "$BASH_COMPLETION" ]] && [[ -r /etc/bash_completion ]]; then
  . /etc/bash_completion
fi

Antes que a Red Hat e outras pessoas incluíssem este pacote, eu costumava copiar manualmente /etc/bash_completion* entre os sistemas. Isso funcionará muito bem, mas eu não o sugiro; Isso também elimina a oportunidade de o seu gerenciador de pacotes atualizar as conclusões existentes e instalar novas (que agora entram em /usr/share/bash-completion/completions/ , embora originalmente tenham sido realizadas com suas conclusões personalizadas em /etc/bash_completion.d/ ).

    
por Adam Katz 21.11.2017 / 20:16