¿Cómo depurar y corregir el autocompletado lento en bash?

26

Después de una actualización reciente (Ubuntu 12.04 LTS), la TAB completa en la línea de comando es lenta. Después de ingresar un comando parcial (p evi [TAB]. Ej. ) O un nombre de archivo parcial (p evince somedocu[TAB]. Ej. ), El shell, a veces, aunque no siempre, se cuelga durante varios segundos.

Personalmente, preferiría un autocompletado menos potente que uno lento. ¿Hay una solución simple?

Editar: Información adicional relacionada con los comentarios:

  • RUTA es bastante estándar. ~ / bin tiene algunos scripts de bash

    $ echo $PATH
    /home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
    
  • El número de archivos en el directorio de trabajo es inferior a 100.

  • La función de autocompletar era especialmente lenta después de una actividad inusual del disco (actualización del sistema). Es, por lo tanto, posible que releer / usr / bin y otros directorios causó el retraso.
ene
fuente
44
¿No es que habilita la administración de la velocidad de su disco duro con la actualización y que el autocompletado espera a que el disco se active para poder calcular el autocompletado?
Vincent Nivoliers
2
¿Depende de cuántos archivos hay en su directorio actual?
terdon
1
¿Qué dice # echo $ PATH? Si tiene muchos (varias decenas de miles o más) de archivos en directorios en su ruta, eso podría estar causándolo.
Stephan

Respuestas:

28

No sé cómo arreglarlo: hay todo tipo de cosas que podrían causar retrasos. Pero puedo ofrecer algunos consejos para investigar.

Solo como una suposición, tal vez hay un directorio en algún lugar de una ruta de búsqueda ( $PATHo en algún lugar donde bash busca datos de finalización) que está en un sistema de archivos que responde lentamente. Por lo general, los sistemas de archivos remotos son lentos, pero también podría ser un disco duro defectuoso, un controlador FUSE bloqueado, etc.

El primer paso para investigar es ejecutar set -xpara obtener un seguimiento de los comandos que ejecuta el shell para generar las terminaciones. Mira donde se detiene.

Si eso no da suficiente información, traiga las armas grandes. Tenga en cuenta el ID de proceso del shell ( echo $$). En otra terminal, ejecute strace -f -s9999 -p$$(o el equivalente de strace si se ejecuta en otro sabor de Unix). Strace enumera las llamadas al sistema realizadas por el proceso. Vea si parece estar accediendo a archivos que no debería, o si el acceso a algunos archivos es lento. Agregar la opción -Ta la stracelínea de comando hace que muestre el tiempo empleado en cada llamada al sistema.

Gilles 'SO- deja de ser malvado'
fuente
1
La cantidad de tiempo que he estado usando Unix y no sabía set -x, qué comando genial. Muy "modo hacker comprometido"
Matt Fletcher
66
Ps, úselo set +xpara volver al modo normal sin depuración
Matt Fletcher
19

Si su casilla * nix está configurada como un cliente LDAP, puede tener este problema, incluso si ha iniciado sesión como usuario local.

Información de depuración aburrida: depurando set-x, encontré la finalización que colgaba en:

> 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

Confirmar: Confirmé esto con el ls ~*que también colgó. Resulta que mi servidor ldap era lento, ¡pero esto no debería afectar cosas como la finalización de bash y ls!

Solución: Ajá, hay un error archivado contra bash-complete + ldap, se solucionará en una versión más nueva y un parche simple si no quieres esperar. La finalización de la pestaña es rápida nuevamente, ¡hurra!

Aquí está el archivo de parche en caso de que el enlace desaparezca. Simplemente está escapando del ~ en las líneas 545 y 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

Debe salir de la sesión ssh actual y volver a iniciar sesión para que este parche surta efecto.

Jeff Ward
fuente
1
Tuve este problema exacto y el parche es bueno
radman
2
El mismo problema aquí (Debian 8.5) 2 1/3 años antes y la solución funciona de maravilla. Debian 8.6 no tiene el problema.
YoMismo
2
He usado set -xa millones de veces, pero nunca esperé que también mostrara problemas de rendimiento de finalización, ¡muchas gracias!
MarcH
¡Tenía este problema con Debian 9.8!
Philippe Gachoud
0

Intenta reinstalar bash-complete

sudo apt-get install --reinstall bash-completion

Para mí esto está arreglado en Ubuntu 18.04.3 LTS

arulraj.net
fuente
0

Además, algunas personas usan funciones adicionales de autocompletado como Git bash auto complete . La lentitud de finalización de bash puede ser el resultado del mal comportamiento de esas funciones de autocompletar adicionales.

En mi caso, fue Git bash auto complete. Mi clave pública git se había actualizado, por lo que estaba haciendo un intento de autenticación fallido que causaba un bloqueo. Una vez que eliminé el autocompletado, fue rápido nuevamente. Entonces, mi solución fue arreglar mi clave y volver a habilitarla.

Nicholas DiPiazza
fuente