Après une mise à jour récente (Ubuntu 12.04 LTS), l'onglet complète sur la ligne de commande est lente. Après avoir entré une commande partielle (E.g evi [TAB]
) ou nom de fichier partiel (par exemple evince somedocu[TAB]
) La coquille, parfois bien que pas toujours, se bloque pendant plusieurs secondes.
Personnellement, je préférerais une autoocomplète moins puissante à un lent. Y a-t-il une solution simple?
Edit : Informations complémentaires relatives aux commentaires:
Le chemin est assez standard. ~/bin a des scripts Bash
$ echo $PATH
/home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
Le nombre de fichiers dans le répertoire de travail est inférieur à 100.
Je ne sais pas de la réparation - il y a toutes sortes de choses qui pourraient faire des retards. Mais je peux offrir quelques conseils pour enquêter.
Tout comme devinez, peut-être qu'il y a un répertoire quelque part dans un chemin de recherche ($PATH
, ou un endroit où Bash recherche des données d'achèvement) sur un système de fichiers qui est lent à répondre. Habituellement, ce sont des systèmes de fichiers distants lents, mais il pourrait également s'agir d'un disque dur défaillant, d'un pilote de fusible suspendu, etc.
La première étape pour enquêter est de courir set -x
Pour obtenir une trace des commandes que la Shell exécute pour générer les achèvements. Regardez où il fait une pause.
Si cela ne donne pas assez d'informations, apportez les gros canons. Notez l'ID de processus de la coque (echo $$
). Dans un autre terminal, courez strace -f -s9999 -p$$
(ou l'équivalent de strace Si elle fonctionne sur une autre saveur UNIX). Strace répertorie les appels système effectués par le processus. Voir si cela semble accéder aux fichiers qu'il ne faut pas ou si l'accès à certains fichiers est lent. Ajout de l'option -T
à la ligne de commande strace
permet de montrer le temps passé dans chaque appel système.
Si votre * NIX Box est configuré en tant que client LDAP, vous pouvez avoir ce problème, même connecté en tant qu'utilisateur local.
Info de débogage ennuyeux: Débogage avec set-x
, J'ai trouvé l'achèvement qui était suspendu à:
> set -x
> ls foo<tab>
... <--- lots of output removed
...
+ _quote_readline_by_ref foo quoted
+ '[' -z foo ']'
+ [[ foo == \'* ]] <--- froze here
+ [[ foo == ~* ]] <--- actually causing the trouble
Confirmer: Je l'ai confirmé avec ls ~*
qui a également accroché. Il s'avère que mon serveur LDAP était lent, mais cela ne devrait pas affecter les choses comme Bash Achion et LS!
solution: AHA, il y a un bug classé contre Bash-achèvement + LDAP, il sera corrigé dans une version plus récente, et a patch simple Si vous ne voulez pas attendre. L'achèvement de l'onglet est à nouveau rapide, Hourra!
Voici le patchfile au cas où le lien disparaît. Il ne fait que s'échapper sur les lignes 545 et 547:
--- /usr/share/bash-completion/bash_completion.orig 2014-11-06 10:36:14.981888369 +0100
+++ /usr/share/bash-completion/bash_completion 2014-11-06 10:36:25.142070963 +0100
@@ -542,9 +542,9 @@
Elif [[ $1 == \'* ]]; then
# Leave out first character
printf -v $2 %s "${1:1}"
- Elif [[ $1 == ~* ]]; then
+ Elif [[ $1 == \~* ]]; then
# avoid escaping first ~
- printf -v $2 ~%q "${1:1}"
+ printf -v $2 \~%q "${1:1}"
else
printf -v $2 %q "$1"
fi
Vous devez quitter la session SSH actuelle et la reconnexion pour que ce correctif prenne effet.
Une autre stratégie consiste à parcourir vos fichiers de configuration Bash et à désactiver tout achèvement. Puis test si c'est plus rapide. Si ce n'est pas plus rapide, c'est probablement quelque chose lié à un disque lent (distant). Mais si c'est plus rapide, vous pouvez activer la fin des termes jusqu'à ce que vous ayez trouvé celui qui a provoqué la lenteur.
J'ai trouvé que mon /etc/bash.bashrc
avait cette partie:
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
Et mon local ~/.bashrc
avait exactement la même chose. Donc, le code d'achèvement a été inclus deux fois et d'une manière ou d'une autre qui a ajouté une lenteur lorsqu'elle achève partiellement un nom de répertoire ambigu.
Essayer de réinstaller Bash-achèvement
Sudo apt-get install --reinstall bash-completion
Pour moi, cela est fixé à Ubuntu 18.04.3 LTS
De plus, certaines personnes utilisent des fonctionnalités complètes automatiques supplémentaires telles que Git Bash Auto complète . La lenteur d'achèvement de Bash peut être le résultat de ces caractéristiques complètes supplémentaires automatiques.
Dans mon cas, c'était Git Bash Auto complète ma clé publique GIT avait été mise à jour afin qu'elle effectuait une tentative d'authentification défaillante, ce qui entraîne une suspension. Une fois que j'ai supprimé la complète automatique, c'était à nouveau rapide. Donc, ma solution était de réparer ma clé et de le réactiver.