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.d
hay ~ 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$PATH
un archivo ejecutable con un nombre de pila. (Aunque esperaría/usr/bin
estar 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 total
si 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 +x
deshabilita el modo de seguimiento).fuente
Encontré una solución un poco hack que parece funcionar bastante bien.
Solución
En la parte inferior de
~/.bashrc
agregar:Explicación
trap 'source /etc/bash_completion ; trap USR1' USR1
Configure 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 $$ ; } & disown
Asincrónicamente espere un poco y luego envíe la señal al shell actual.
disown
es necesario para suprimir labash
retroalimentación del control del proceso.sleep
es 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 true
informa ~ 0.12s con o sin esto, a pesar de quetime source /etc/bash_completion
informa números más altos como 0.26s. ¿Se ha solucionado esto efectivamente ?time bash -lc true
funciona correctamente aquí, ya quetrue
termina antes,~0.1s
por lo que no genera nada. De todos modostime source /etc/bash_completion
informa ~ 0.17s aquí y ese es el tiempo que necesito esperar para quePS1
aparezca.USR1
a 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_completion
es 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
PS1
es\u@\h:\w\$
, ellos podrían escribir algo como:Dónde:
2J
borra el terminal;H
mueve 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[2J
evita el parpadeo, pero dejará caracteres basura si el marcador de posición es más largo que el indicador real.fuente