Je ne comprends pas pourquoi l'achèvement de bash est chargé si lentement sur mon MacBook Pro.
J'ai fait ce qui suit dans mon ~/.bash_profile
:
echo "Loading BashCompletion..."
if [ -f /opt/local/etc/bash_completion ]; then
. /opt/local/etc/bash_completion
fi
echo "BashCompletion loaded."
le temps d'exécution pour bash_completion est généralement> 2 secondes.
Je trouve cela vraiment ennuyeux lorsque je travaille sur le terminal, ce qui m'oblige à ouvrir constamment de nouveaux onglets.
Existe-t-il un moyen de mettre en cache ceci ou quelque chose?
(Notez que j'utilise iTerm2 et que c'est également lent sur le terminal d'origine sur Mac).
Réponses:
Version courte: la suppression d'une seule ligne du temps
/usr/local/etc/bash_completion
réduit pour ouvrir un nouvel onglet de dix secondes à un quart de seconde. Lisez la suite pour plus de détails.J'utilise bash-complètement de homebrew et j'ai rencontré le même problème. Il fallait plus de dix secondes pour charger les scripts d'achèvement de bash chaque fois que j'ouvrais un terminal.
La plupart du temps, il semble être occupé par une seule ligne dans la
have()
fonction: un appel àtype
pour déterminer si un programme en ligne de commande est installé.Avec la
have()
fonction par défaut et tous les scripts d'achèvement de bash fournis en place, il faudrait 10,561 secondes pour charger les scripts (signalés en préfixanttime
la. /opt/local/etc/bash_completion
ligne de mon.bash_profile
fichier.Après avoir commenté la
PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&
ligne de mon/usr/local/etc/bash_completion
script (quitter lahave=yes
ligne, ouvrir un nouveau terminal ne prend que 0,258 s. Ce temps pourrait être encore réduit en supprimant les scripts de fin inutiles (liens symboliques) du/usr/local/etc/bash_completion.d
répertoire.Je ne sais pas pourquoi l'appel
type
prend si longtemps. J'enquête ensuite.Un inconvénient potentiel de cette approche est qu'elle entraînera le chargement en mémoire des fonctions d'achèvement de bash même si vous ne les utilisez pas. La
have()
fonction vérifie si une commande ou une application est installée. Si ce n'est pas le cas, le script d'achèvement décide généralement de ne pas s'embêter à se charger car il ne sera d'aucune utilité.Pour le moment, je suis satisfait du compromis, mais je continuerai d'explorer le
type
problème au fur et à mesure que j'aurai le temps. Je mettrai à jour ma réponse si je trouve une meilleure solution.la source
Pour ceux qui arrivent à la conclusion que les temps de démarrage pour les nouveaux shells sur MacOS sont trop lents pour eux, c'est la solution .
Je viens de découvrir qu'il existe en fait deux packages qui peuvent être installés via
brew
. J'installe lebash-completion
package depuis des années, et je n'ai jamais pris la peine de le remettre en question, même si, à cette époque, je suis passé de Bash 3, à 4, jusqu'à maintenant 5. De temps en temps, cependant, je revisiterais le problème , tombant souvent sur cette discussion très StackOverflow.Il y a un autre package
bash-completion@2
,!Quelle est la différence?
bash-completion
est pour Bash version 3.2.bash-completion@2
est pour Bash version 4.1+ et 5.En supprimant l'ancien
bash-completion
package et en installantbash-completion@2
, mes temps de démarrage du shell sont passés de 605 ms à 244 ms. C'est une énorme amélioration de la vitesse.Je soupçonne que beaucoup d'entre nous font la même erreur, car les
brew info
statistiques montrent que le premier a des tonnes d'installations, tandis que le second en a si peu:Il convient de noter que la réponse actuellement choisie mentionne commenter certaines lignes, ce qui n'améliore que légèrement les temps de démarrage (si vous utilisez l'ancien
bash-completion
package, ce que beaucoup sont probablement), mais n'a aucun impact sur le nouveaubash-completion@2
package: ce nouveau package est rapide quoi qu'il arrive. Cela signifie qu'aucun piratage n'est requis.TL; DR:
N'oubliez pas de mettre à jour le chemin source vers le fichier d'achèvement dans votre fichier
.bashrc
ou.bash_profile
.Sources:
En tant que sujet quelque peu lié, j'utilise
rclone
beaucoup l' utilitaire, il est donc installé. Il se trouve également que le fichier d'achèvement le plus volumineux que j'ai jamais vu . Le supprimer réduit le temps de démarrage de mon shell à ~ 120 ms, ce qui est très rapide.Éditer:
Pour tous ceux qui veulent les détails techniques qui expliquent ce problème, j'ai longuement écrit à ce sujet sur les forums Homebrew . Pour résumer, la raison pour laquelle cela
bash-completion@2
est beaucoup plus rapide est qu'il a été écrit de manière à ne plus charger tous les fichiers d'achèvement avec impatience ; au lieu de cela, il charge un fichier d'achèvement à la demande, ou comme l'auteur le décrit, il les charge de manière non désireuse .la source
version 3.2.57(1)-release (x86_64-apple-darwin18)
. Merci d'avoir fait remarquer cela; J'ai supprimé la ligne de mon message.Avec l'idée que godbyk m'a donnée, j'ai trouvé que ma variable PATH avait quelques répertoires qui n'avaient pas de binaires ou qui n'existaient pas, les supprimer les a accélérés de manière significative. En d'autres termes, voici le CHEMIN que j'avais dans mon bashrc:
Et puis je l'ai changé en:
C'était parce que la
have
fonction dans cet achèvement bash, cherchait chaque commande, et j'avais trop de répertoires inutiles qui allaient être visités pour chacun de ces binaires, les supprimant les accéléra.la source
J'ai eu le même problème. Quelques astuces de débogage simples m'ont amené à la cause première.
Tout d'abord, activez
DEBUG mode
pour voir ce qui se passe:Cela permet une impression détaillée sur la console, vous pouvez donc voir la dernière commande. Vous pouvez maintenant exécuter le script en arrière-plan et vous verrez ce qui se passe
Ne prenez pas le
PID
, que vous pouvez ensuite tracer avecps
oupstree
:pstree -p <the PID>
:Comme vous pouvez le voir, il a démarré certaines commandes liées à la rouille, qui prenaient des âges.
La suppression temporaire a
/opt/boxen/homebrew/etc/bash_completion.d/cargo
résolu mes symptômes.la source
Si vous utilisez MacPorts> = 2.1.2 et Mountain Lion, il semble que vous ayez
bash_profile
tort. Suivez les instructions sur Comment faire fonctionner git-complétement.bash sur Mac OS X? . Je suppose que cela pourrait accélérer l'auto-complétion.Une autre solution serait d'essayer d'installer l'auto-complétion via Fink ou Homebrew. Si cela ne fonctionne pas, vous pouvez essayer un autre shell. J'ai trouvé que la coque Fish est exceptionnelle en ce qui concerne l'auto-complétion (prête à l'emploi). Bien que la version 2 soit encore en version bêta, je la recommande vivement.
la source
Je vais deviner que votre bash est trop vieux. J'utilise stock bash fourni avec Mountain Lion et voici ce que je vois:
la source