Ich verstehe nicht, warum die Bash-Vervollständigung auf meinem MacBook Pro so langsam geladen wird.
Ich habe folgendes in meinem gemacht ~/.bash_profile
:
echo "Loading BashCompletion..."
if [ -f /opt/local/etc/bash_completion ]; then
. /opt/local/etc/bash_completion
fi
echo "BashCompletion loaded."
Die Ausführungszeit für bash_completion beträgt in der Regel> 2 Sekunden.
Ich finde das sehr ärgerlich, wenn ich am Terminal arbeite und ständig neue Tabs öffnen muss.
Gibt es eine Möglichkeit, dies oder etwas zwischenzuspeichern?
(Beachten Sie, dass ich iTerm2 verwende und dies auf dem Original-Terminal in Mac ebenso langsam ist).
Antworten:
Kurzversion: Durch das Entfernen einer einzelnen Zeile aus wurde
/usr/local/etc/bash_completion
die Zeit zum Öffnen eines neuen Tabs von zehn Sekunden auf eine Viertelsekunde verkürzt. Lesen Sie weiter für Details.Ich verwende Bash-Vervollständigung von Homebrew und habe das gleiche Problem festgestellt. Bei jedem Öffnen eines Terminals dauerte das Laden der Bash-Abschlussskripte mehr als zehn Sekunden.
Die meiste Zeit scheint es in einer einzigen Zeile in der
have()
Funktion zu sein: ein Aufruf,type
um festzustellen, ob ein Befehlszeilenprogramm installiert ist.have()
Wenn die Standardfunktion und alle bereitgestellten Bash-Vervollständigungsskripte vorhanden sind, würde das Laden der Skripte 10,561 Sekunden dauern (gemeldet durch das Präfixtime
in der. /opt/local/etc/bash_completion
Zeile in meiner.bash_profile
Datei).Nachdem ich die
PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&
Zeile meines/usr/local/etc/bash_completion
Skriptshave=yes
auskommentiert habe (beim Verlassen der Zeile dauert das Öffnen eines neuen Terminals nur 0,258 Sekunden. Diese Zeit könnte weiter verkürzt werden, indem unnötige Abschlussskripts (Symlinks) aus dem/usr/local/etc/bash_completion.d
Verzeichnis entfernt werden.Ich weiß nicht, warum der Anruf
type
so lange dauert. Ich untersuche das als nächstes.Ein möglicher Nachteil dieses Ansatzes besteht darin, dass Bash-Completion-Funktionen in den Speicher geladen werden, obwohl Sie sie nicht verwenden können. Die
have()
Funktion prüft, ob ein Befehl oder eine Anwendung installiert ist. Wenn dies nicht der Fall ist, beschließt das Abschlussskript im Allgemeinen, sich nicht um das Laden zu kümmern, da es keinen Nutzen bringt.Im Moment bin ich mit dem Kompromiss zufrieden, aber ich werde das
type
Problem weiter untersuchen, sobald ich Zeit habe. Ich werde meine Antwort aktualisieren, wenn ich eine bessere Lösung finde.quelle
Für alle, die zu dem Schluss kommen, dass die Startzeiten für neue Shells unter MacOS zu lang sind, ist dies die Lösung .
Ich habe gerade festgestellt, dass es tatsächlich zwei Pakete gibt, über die installiert werden können
brew
. Ich habe dasbash-completion
Paket seit Jahren installiert und mich nie darum gekümmert, es in Frage zu stellen, obwohl ich in dieser Zeit von Bash 3 zu 4 zu jetzt 5 übergegangen bin. Von Zeit zu Zeit würde ich das Problem jedoch noch einmal untersuchen stolpert oft über diese StackOverflow-Diskussion.Es gibt noch ein Paket
bash-completion@2
!Was ist der Unterschied?
bash-completion
ist für Bash Version 3.2.bash-completion@2
ist für Bash Version 4.1+ und 5.Durch das Entfernen des alten
bash-completion
Pakets und die Installationbash-completion@2
sind meine Shell-Startzeiten von 605 ms auf 244 ms gesunken. Das ist eine enorme Geschwindigkeitsverbesserung.Ich vermute, dass viele von uns den gleichen Fehler machen, da die
brew info
Statistiken zeigen, dass Ersteres Tonnen von Installationen hat, während Letzteres so wenige hat:Es sollte beachtet werden, dass die aktuell gewählte Antwort das Auskommentieren einiger Zeilen erwähnt, was die Startzeiten nur geringfügig verbessert (wenn das alte
bash-completion
Paket verwendet wird, was wahrscheinlich viele sind), aber keinerlei Auswirkungen auf das neuebash-completion@2
Paket hat: dieses neue Paket ist schnell egal was. Das bedeutet, dass keine Hacks erforderlich sind.TL; DR:
Denken Sie daran, den Quellpfad zur Abschlussdatei in Ihrer Datei
.bashrc
oder zu aktualisieren.bash_profile
.Quellen:
Als etwas verwandtes Thema benutze ich das
rclone
Dienstprogramm häufig, daher ist es installiert. Es ist auch die größte Abschlussdatei, die ich je gesehen habe . Durch das Entfernen wird die Startzeit meiner Shell auf ~ 120 ms reduziert, was sehr schnell ist.Bearbeiten:
Für alle, die die technischen Details wissen möchten, die dieses Problem erklären, habe ich ausführlich in den Homebrew-Foren darüber geschrieben . Um es zusammenzufassen, dass der Grund ,
bash-completion@2
so viel schneller ist , weil es geschrieben wurde , so dass es nicht mehr mit Spannung lädt alle Abschluss - Dateien; Stattdessen wird eine Abschlussdatei nach Bedarf geladen oder, wie der Autor es beschreibt, auf nicht eifrige Weise geladen .quelle
version 3.2.57(1)-release (x86_64-apple-darwin18)
. Vielen Dank, dass Sie darauf hingewiesen haben. Ich habe die Linie von meinem Beitrag entfernt.Mit der Idee, die Godbyk mir gab, stellte ich fest, dass meine PATH-Variable einige Verzeichnisse enthielt, die keine Binärdateien hatten oder nicht existierten, und entfernte sie erheblich. Mit anderen Worten, dies ist der Pfad, den ich in meinem Baschromat hatte:
Und dann habe ich es geändert:
Dies lag daran, dass die
have
Funktion in dieser Bash-Vervollständigung nach jedem Befehl suchte und ich zu viele nutzlose Verzeichnisse hatte, die für jede dieser Binärdateien besucht werden sollten, wodurch sie schneller wurden.quelle
Ich hatte das gleiche Problem. Ein paar einfache Debugging-Tricks brachten mich zur eigentlichen Ursache.
Aktivieren
DEBUG mode
Sie zuerst, damit Sie sehen können, was passiert:Auf diese Weise können Sie ausführlich über die Konsole drucken und den letzten Befehl anzeigen. Sie können das Skript jetzt im Hintergrund ausführen und sehen, was passiert
Nimm nicht das
PID
, womit du dann verfolgen kannstps
oderpstree
:pstree -p <the PID>
:Wie Sie sehen, wurden einige rostbezogene Befehle gestartet, die Ewigkeiten in Anspruch nahmen.
Das vorübergehende Entfernen
/opt/boxen/homebrew/etc/bash_completion.d/cargo
löste meine Symptome.quelle
Wenn Sie mit MacPorts> = 2.1.2 und Mountain Lion arbeiten, scheint dies
bash_profile
falsch zu sein. Befolgen Sie die Anweisungen unter So funktioniert git-completion.bash unter Mac OS X? . Ich gehe davon aus, dass dies die automatische Vervollständigung beschleunigen könnte.Eine andere Lösung wäre, zu versuchen, die automatische Vervollständigung über Fink oder Homebrew zu installieren . Wenn das nicht funktioniert, können Sie auch eine andere Shell ausprobieren. Ich habe festgestellt, dass Fish Shell hervorragend ist, wenn es um die automatische Vervollständigung geht (out of the box). Obwohl Version 2 noch in der Beta ist, kann ich es nur empfehlen.
quelle
Ich vermute, dass Ihre Bash zu alt ist. Ich führe Stock Bash aus, das mit Mountain Lion geliefert wurde, und hier ist, was ich sehe:
quelle