web-dev-qa-db-fra.com

La complétion par tabulation ne fonctionne pas pour les commandes

J'essaie d'utiliser la complétion par tabulation pour les commandes dans Ubuntu 11.04 Bêta 1, en exécutant toutes les dernières mises à jour, mais cela ne semble pas fonctionner. (Bien que le paquet bash-completion soit installé)

La complétion par onglets ne fonctionne correctement que pour les répertoires ou les fichiers.

Des idées où creuser?

49
Screatch

Vérifiez si vous avez le fragment suivant dans votre .bashrc (devrait être là par défaut)

# 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
65
Adam Byrtek

Je pensais également ajouter l'explication supplémentaire suivante pour un échec d'achèvement de Bash - c'est trop long pour un commentaire et peut être utile pour quelqu'un qui a un problème avec l'achèvement de Bash, car il s'agit vraisemblablement de la question canonique "générale" à laquelle tous les doublons sont référés.

Même si vous avez la ligne appropriée dans votre .bashrc (comme dans la réponse ci-dessus) et le package bash-completion installé, l'exécution de bash peut toujours ne pas fonctionner correctement si vous avez soit shopt -s nullglob ou shopt -s failglob dans votre .bashrc ou .bash_aliases.

Les scénarios suivants ont été testés avec toutes les personnalisations de .bashrc et .bash_aliases personnalisées par l'utilisateur, afin de permettre un test correct, avec la ligne d'achèvement Bash appropriée dans .bashrc present et avec bash-completion installé.

1) Le premier scénario est lorsque vous avez shopt -s failglob dans votre .bashrc ou .bash_aliases.

Lorsque vous essayez de tabuler des répertoires et des fichiers complets, respectivement, ces erreurs se produisent:

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

Cependant, les commandes se termineront toujours avec succès.

2) Lorsque shopt -s nullglob est activé, le fait de compléter un répertoire ou un fichier par un onglet conduira à la liste complète des éléments, sans aucun achèvement:

cd Do
.Adobe/                  .gimp-2.6/               Podcasts/
.aptitude/               .gnome2/                 Public/
.audacity-data/          .gnome2_private/         .Pulse/
............

J'ai coupé la liste ici, car c'était très long et pas nécessaire de tout reproduire.

Encore une fois, l’achèvement de la commande fonctionnera toujours.

Ainsi, retirer simplement shopt -s failglob ou shopt -s nullglob pourrait également résoudre le problème des erreurs d’achèvement de bash, en supposant que vous ayez la ligne appropriée dans votre .bashrc et bash-completion.

13
user76204

En plus de la modification du fichier /etc/bash.bashrc (voir d’autres réponses), vous devrez peut-être installer le paquetage bash-completion.

Vérifiez si le fichier /etc/bash_completion existe. Sinon:

Sudo apt-get install bash-completion

(Dans mon installation de Debian 7, il n'était pas installé initialement)

9
SergeanT

Aussi basique que cela puisse paraître, assurez-vous que bash est votre shell actif

echo $Shell

Je viens de passer à Ubuntu 14.04.1 LTS et je n'avais pas de complétion automatique des onglets, même après avoir suivi les conseils donnés sur ce message, seulement pour réaliser que mon shell était défini sur /bin/sh et non pas /bin/bash.

7
nocdib

Mise à jour vers Ubuntu 14.04.01

Vérifiez si vous avez le fragment suivant dans votre .bashrc (devrait être là par défaut)

Sudo vim /etc/bash.bashrc (tapez "i" pour éditer le fichier)

    # 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

Ne commentez pas 7 lignes ci-dessus

Enregistrer le fichier "esc + w + q + enter"

Redémarrer Bash

exec bash

1
Diego Arriola