Le démarrage d'un bash sur mon système ubuntu prend environ 2 secondes. Si je supprime le chargement de / etc / bash_completition dans .bashrc, il démarre sans délai. Bien sûr, je ne veux pas abandonner la fin et je ne pense pas que le chargement de ce fichier soit une raison légitime pour un délai de 2 secondes.
Toutes les idées comment je peux découvrir quel est le problème ou comment je peux accélérer les choses.
ubuntu
performance
bashrc
tab-completion
user75250
la source
la source
Réponses:
Mise à jour en 2013: la majeure partie de l'achèvement de bash a été réécrite pour terminer automatiquement le chargement uniquement en cas de besoin. Le script de base est désormais beaucoup plus léger.
Le script d'achèvement peut parfois être énorme dans les normes de script shell. Sur un serveur auquel j'ai accès, c'est presque 1700 lignes (57 Ko) et c'est juste le script principal . Dans
/etc/bash_completion.d
il y a ~ 200 scripts supplémentaires pour d'autres commandes (openssl
,mutt
,mount
...) pour un total 25537 lignes ou 1,2 MB. Chaque script, une fois obtenu, vérifie si une commande est réellement disponible avant de définir des gestionnaires d'achèvement; ~ 330 fois dans ce cas, chacun impliquant la vérification$PATH
d'un fichier exécutable avec un nom donné. (Bien que je m'attende/usr/bin
à être mis en cache en mémoire ...)Certes, même cela ne prend qu'une demi-seconde à charger, pas deux secondes complètes. Mais cela pourrait être au moins une partie du problème. Exécutez
du -hs /etc/bash_completion*
ouwc -l /etc/bash_completion{,.d/*} | grep total
si vous voulez vérifier.Vous pouvez essayer de sourcer manuellement le script, en mode "trace":
Vous verrez chaque ligne au fur et à mesure de son exécution. S'il y a une commande particulière qui prend beaucoup de temps, vous devez la remarquer.
(
set +x
désactive le mode trace.)la source
J'ai trouvé une solution un peu hack qui semble fonctionner assez bien.
Solution
Au bas de l'
~/.bashrc
ajout:Explication
trap 'source /etc/bash_completion ; trap USR1' USR1
Configurez un gestionnaire à exécuter lorsque le shell reçoit le signal
SIGUSR1
; le gestionnaire chargera les complétions et donc il se désactivera.{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown
Attendez un peu de manière asynchrone puis envoyez le signal au shell actuel.
disown
est nécessaire pour supprimer labash
rétroaction du contrôle de processus.sleep
est nécessaire pour fonctionner de manière asynchrone.Problèmes
Pour une raison quelconque, la première commande envoyée à ce shell ne sera pas enregistrée dans l'historique.
la source
time bash -lc true
rapporte ~ 0,12s avec ou sans cela, même si destime source /etc/bash_completion
rapports plus élevés comme 0,26s. Cela a-t-il effectivement été corrigé ?time bash -lc true
fonctionne correctement ici depuis latrue
fin,~0.1s
donc il ne source rien. Quoi qu'il en soittime source /etc/bash_completion
, il y a ~ 0,17s ici et c'est à peu près le temps que je dois attendre pourPS1
apparaître.USR1
à la fin.Vous devez utiliser la dernière version (2.0) de bash_completion. Si vous utilisez Debian, il est dans Wheezy, mais il n'a aucune dépendance sur aucun autre paquet Wheezy, vous pouvez donc l'installer sur un squeeze sans problème.
La dernière version charge l'achèvement de manière dynamique à la volée, elle a donc divisé le temps de chargement rapide pour moi d'au moins 10 fois.
la source
Vous pouvez utiliser un espace réservé pendant le chargement des finitions; cela devrait suffire à tromper vos yeux. Cela ne fonctionne évidemment que si le temps requis par
source /etc/bash_completion
est inférieur au temps dont vous avez besoin pour taper et émettre la première commande shell, sinon elle sera également retardée.L'idée est de faire écho à un faux
PS1
, de se procurer les achèvements et enfin d'effacer le terminal.Supposons que votre
PS1
est -\u@\h:\w\$
ils que vous pourriez écrire quelque chose comme:Où:
2J
efface le terminal;H
déplacez le curseur dans le coin supérieur droit.Remarque: vous souhaiterez peut-être vérifier si l'utilisateur est root et utiliser
#
au lieu de$
pour des raisons de cohérence:Remarque: La suppression
\e[2J
évite le scintillement, mais elle laissera des caractères indésirables si l'espace réservé est plus long que l'invite réelle.la source