A conclusão da guia não funciona para comandos


50

Estou tentando usar o preenchimento de guias para comandos no Ubuntu 11.04 Beta 1, executando todas as atualizações mais recentes, mas parece não funcionar. (Embora a conclusão do bash do pacote esteja instalada)

A conclusão da guia funciona corretamente apenas para diretórios ou arquivos.

Alguma idéia de onde cavar?


Respostas:


67

Verifique se você tem o seguinte fragmento no seu .bashrc (deve estar lá por padrão)

# 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 [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Obrigado! Substituí .bashrc pelo meu e, portanto, não consegui descobrir qual era o problema. Funciona perfeitamente agora.
Screatch

isso corrigiu meus preenchimentos automáticos do git bash no xubuntu 12.04 também, muito obrigado.
Palmic

Que tal o preenchimento automático para opção e opção de linha de comando apt-get? ou seja, quando você entra no apt-get ins e pressiona a guia para completá-lo automaticamente.
Reza Ghodsi

3
Eu gostaria de acrescentar que o pacote bash-completioné necessário para que isso funcione. Estranhamente, a instalação padrão da minha empresa não possui este pacote.
Edgar

13

Pensei em adicionar também a seguinte explicação adicional para uma falha na conclusão do bash - é muito longo para um comentário e pode ser útil para alguém que tenha um problema com o término do bash, pois provavelmente essa é a pergunta canônica 'geral' à qual todas as duplicatas são referidas.

Mesmo se você tiver a linha apropriada no seu .bashrc(como na resposta acima) e o bash-completionpacote instalado, a conclusão do bash ainda poderá funcionar mal se você tiver um shopt -s nullglobou shopt -s failglobno seu .bashrcou .bash_aliases.

Os cenários a seguir foram testados com todas as personalizações do usuário .bashrce .bash_aliasesremovidos para fornecer um teste justo, com a linha de conclusão do bash apropriada no .bashrcpresente e com a bash-completioninstalada.

1) O primeiro cenário é quando você tem shopt -s failglobno seu .bashrcou .bash_aliases.

Ao tentar tabular diretórios e arquivos completos, respectivamente, esses erros ocorrerão:

cd Dbash: no match: "${COMP_WORDS[@]}"  
cat pabash: no match: words[0]=${!ref}${COMP_WORDS[i]}

No entanto, os comandos ainda serão concluídos com êxito.

2) Com shopt -s nullglobativado, tentar tabular um diretório ou um arquivo levará a que tudo seja listado, sem conclusão:

cd Do
.adobe/                  .gimp-2.6/               Podcasts/
.aptitude/               .gnome2/                 Public/
.audacity-data/          .gnome2_private/         .pulse/
............

Abreviei a lista aqui, pois era muito longa e não era necessário reproduzir tudo.

Novamente, a conclusão do comando ainda funcionará.

Portanto, basta remover shopt -s failglobou shopt -s nullglobtambém resolver o problema de erros com a conclusão do bash, supondo que você tenha a linha apropriada no seu .bashrce bash-completioninstalada.


1
Boa explicação, resolveu o meu problema quando estou tentando concluir a tabulação e ocorreu um erro >> words [0] = $ {! Ref} $ {COMP_WORDS [i]} #
bagustris

Embora isso funcione como uma solução alternativa, é ruim para qualquer programador de conclusão confiar. Como nullglob (que é nominalmente melhor para muitos) e parentes podem ser configurados, qualquer código completo que exija a semântica antiga (curingas sem correspondências resultam no próprio curinga) deve salvar a configuração glob atual, definir a que eles precisam e restaurar o depois, como o IFS é normalmente usado.
Alex-North-Keys

10

Além de modificar o /etc/bash.bashrcarquivo (veja outras respostas), pode ser necessário instalar o bash-completionpacote.

Verifique se o /etc/bash_completionarquivo existe. Se não:

sudo apt-get install bash-completion

(Na minha instalação do Debian 7, ele não foi instalado inicialmente)


7

Por mais básico que possa parecer, verifique se o bash é seu shell ativo

echo $SHELL

Acabei de atualizar para o Ubuntu 14.04.1 LTS e não tinha preenchimento automático de guia, mesmo depois de seguir os conselhos deste post, apenas para perceber que meu shell estava definido /bin/shcomo não /bin/bash.


2

Atualizando para o Ubuntu 14.04.01

Verifique se você tem o seguinte fragmento no seu .bashrc (deve estar lá por padrão)

sudo vim /etc/bash.bashrc (digite "i" para editar o arquivo)

    # enable bash completion in interactive shells
    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

Remova o comentário 7 linhas acima

Salvar arquivo "esc + w + q + enter"

Reiniciar o bash

festança exec


1
O que isso fará? Não é assim por padrão?
Tim

Como o @Tim diz, essa configuração é fornecida pela configuração padrão.
ssoto

Isso funcionou para mim
Thamaraiselvam

Esta resposta funcionou como um encanto, e tem votos negativos ???
greuze
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.