Iniciar un bash en mi sistema ubuntu tarda unos 2 segundos. Si elimino la carga / etc / bash_completition en .bashrc, se inicia sin demora. Por supuesto, no quiero renunciar a la finalización y no creo que cargar ese archivo sea una razón legítima para un retraso de 2 segundos.
Alguna idea de cómo puedo averiguar cuál es el problema o cómo puedo acelerar las cosas.
ubuntu
performance
bashrc
tab-completion
usuario75250
fuente
fuente

Respuestas:
Actualización en 2013: la mayor parte de la finalización de bash se reescribió a finalizaciones de carga automática solo cuando fue necesario. El guión central es mucho más ligado ahora.
El script de finalización a veces puede ser enorme en los estándares de script de shell. En uno de los servidores a los que tengo acceso, son casi 1700 líneas (57 KB) y ese es solo el script central . En
/etc/bash_completion.dhay ~ 200 secuencias de comandos adicionales para varios otros comandos (openssl,mutt,mount...) por un total de 25537 líneas o 1,2 MB. Cada secuencia de comandos, cuando se obtiene, verifica si un comando está realmente disponible antes de definir los controladores de finalización; ~ 330 veces en este caso, cada una de las cuales implica buscar$PATHun archivo ejecutable con un nombre de pila. (Aunque esperaría/usr/binestar en la memoria caché ...)Es cierto que incluso eso solo tarda medio segundo en cargarse, no dos segundos completos. Pero podría ser al menos parte del problema. Ejecutar
du -hs /etc/bash_completion*owc -l /etc/bash_completion{,.d/*} | grep totalsi quieres comprobarlo.Puede intentar obtener manualmente el script, en modo "rastreo":
Verá cada línea a medida que se ejecuta. Si hay un comando en particular que lleva mucho tiempo, debería notarlo.
(
set +xdeshabilita el modo de seguimiento).fuente
Encontré una solución un poco hack que parece funcionar bastante bien.
Solución
En la parte inferior de
~/.bashrcagregar:trap 'source / etc / bash_completion; trampa USR1 'USR1 {dormir 0.1; matanza incorporada -USR1 $$; } y rechazarExplicación
trap 'source /etc/bash_completion ; trap USR1' USR1Configure un controlador para que se ejecute cuando el shell reciba la señal
SIGUSR1; el controlador cargará las finalizaciones y, por lo tanto, se desactivará solo.{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disownAsincrónicamente espere un poco y luego envíe la señal al shell actual.
disownes necesario para suprimir labashretroalimentación del control del proceso.sleepes necesario para trabajar de forma asincrónicaProblemas
Por alguna razón, el primer comando emitido a este shell no se registrará en el historial.
fuente
time bash -lc trueinforma ~ 0.12s con o sin esto, a pesar de quetime source /etc/bash_completioninforma números más altos como 0.26s. ¿Se ha solucionado esto efectivamente ?time bash -lc truefunciona correctamente aquí, ya quetruetermina antes,~0.1spor lo que no genera nada. De todos modostime source /etc/bash_completioninforma ~ 0.17s aquí y ese es el tiempo que necesito esperar para quePS1aparezca.USR1a al final.Debe usar la última versión (2.0) de bash_completion. Si está utilizando Debian, está en wheezy, pero no depende de ningún otro paquete de wheezy, por lo que puede instalarlo sin problemas.
La última versión carga la finalización dinámicamente sobre la marcha, por lo que dividió el tiempo de carga rápido para mí por al menos 10 veces.
fuente
Puede usar un marcador de posición mientras se cargan las finalizaciones; debería ser suficiente para engañar a tus ojos. Obviamente, esto solo funciona si el tiempo que necesita
source /etc/bash_completiones menor que el tiempo que necesita para escribir y emitir el primer comando de shell; de lo contrario, también se retrasará.La idea es hacer eco de una falsificación
PS1, obtener las terminaciones y finalmente eliminar la terminal.Supongamos que tu
PS1es\u@\h:\w\$, ellos podrían escribir algo como:Dónde:
2Jborra el terminal;Hmueve el cursor a la esquina superior derecha.Nota: es posible que desee comprobar si el usuario es root y usar en
#lugar de$mantener la coherencia:Nota: la eliminación
\e[2Jevita el parpadeo, pero dejará caracteres basura si el marcador de posición es más largo que el indicador real.fuente