Das Starten einer Bash auf meinem Ubuntu-System dauert ca. 2 Sekunden. Wenn ich das Laden von / etc / bash_completition in .bashrc entferne, wird es unverzüglich gestartet. Natürlich möchte ich die Vervollständigung nicht aufgeben und ich denke nicht, dass das Laden dieser Datei ein legitimer Grund für eine Verzögerung von 2 Sekunden ist.
Irgendwelche Ideen, wie ich herausfinden kann, was das Problem ist oder wie ich Dinge beschleunigen kann.
ubuntu
performance
bashrc
tab-completion
user75250
quelle
quelle
Antworten:
Update im Jahr 2013: Der Großteil der Bash-Vervollständigung wurde nur bei Bedarf in Autoload-Vervollständigungen umgeschrieben. Das Kernskript ist jetzt viel heller.
Das Abschlussskript kann in Shell-Skriptstandards manchmal sehr umfangreich sein . Auf einem Server, auf den ich Zugriff habe, sind es fast 1700 Zeilen (57 KB) und das ist nur das Kernskript . In
/etc/bash_completion.d
gibt es ~ 200 zusätzlichen Skripte für verschiedene andere Befehle (openssl
,mutt
,mount
...) in Höhe von insgesamt 25.537 Zeilen oder 1,2 MB. Jedes Skript prüft, wenn es bereitgestellt wird, ob ein Befehl tatsächlich verfügbar ist, bevor Abschlusshandler definiert werden. In diesem Fall ~ 330 Mal, wobei jeweils$PATH
nach einer ausführbaren Datei mit einem bestimmten Namen gesucht wird. (Obwohl ich erwarten würde/usr/bin
, im Speicher zwischengespeichert zu werden ...)Zugegeben, selbst das dauert nur eine halbe Sekunde, nicht zwei volle Sekunden. Aber es könnte zumindest ein Teil des Problems sein. Führen Sie
du -hs /etc/bash_completion*
oderwc -l /etc/bash_completion{,.d/*} | grep total
wenn Sie überprüfen möchten.Sie können versuchen, das Skript im "Trace" -Modus manuell aufzurufen:
Sie werden jede Zeile sehen, wie sie ausgeführt wird. Wenn es einen bestimmten Befehl gibt, der lange dauert, sollten Sie ihn bemerken.
(
set +x
Deaktiviert den Trace-Modus.)quelle
Ich habe eine etwas hackige Lösung gefunden, die ziemlich gut zu funktionieren scheint.
Lösung
Am Ende von
~/.bashrc
add:Erläuterung
trap 'source /etc/bash_completion ; trap USR1' USR1
Richten Sie einen Handler ein, der ausgeführt werden soll, wenn die Shell das Signal empfängt
SIGUSR1
. Der Handler lädt die Vervollständigungen und deaktiviert sich daher von selbst.{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown
Warten Sie ein wenig asynchron und senden Sie dann das Signal an die aktuelle Shell.
disown
wird benötigt, umbash
Rückkopplungen der Prozesssteuerung zu unterdrücken .sleep
wird benötigt, um asynchron zu arbeiten.Probleme
Aus irgendeinem Grund wird der erste Befehl, der an diese Shell ausgegeben wird, nicht im Verlauf aufgezeichnet.
quelle
time bash -lc true
Berichte ~ 0.12s mit oder ohne diese, obwohltime source /etc/bash_completion
Berichte höhere Zahlen wie 0.26s. Wurde dies effektiv behoben ?time bash -lc true
hier richtig funktioniert, da es schontrue
fertig ist und~0.1s
es keine Quelle gibt. Sowiesotime source /etc/bash_completion
meldet sich hier ~ 0.17s und das ist ungefähr die Zeit, die ich auf dasPS1
Erscheinen warten muss .USR1
am Ende.Sie sollten die neueste Version (2.0) von bash_completion verwenden. Wenn Sie Debian verwenden, ist es in Wheezy, aber es hat keine Abhängigkeiten von irgendeinem anderen Wheezy-Paket, so dass Sie es problemlos in einem Squeeze installieren können.
Die neueste Version lädt die Fertigstellung dynamisch im laufenden Betrieb, sodass die Ladezeit für mich durch mindestens das 10-fache geteilt wurde.
quelle
Sie können einen Platzhalter verwenden, während die Vervollständigungen geladen werden. es sollte genug sein, um deine Augen zu betrügen. Dies funktioniert natürlich nur, wenn die Zeit, die von benötigt
source /etc/bash_completion
wird, kürzer ist als die Zeit, die Sie zum Eingeben und Ausgeben des ersten Shell-Befehls benötigen. Andernfalls wird dies ebenfalls verzögert.Die Idee ist, eine Fälschung
PS1
nachzuahmen, die Fertigstellungen zu beschaffen und schließlich das Terminal zu löschen.Nehmen wir an , Ihr
PS1
heißt\u@\h:\w\$
, sie könnten Sie schreiben so etwas wie:Wo:
2J
löscht das Terminal;H
Bewegen Sie den Cursor in die obere rechte Ecke.Hinweis: Möglicherweise möchten Sie überprüfen, ob der Benutzer root ist, und
#
stattdessen aus Gründen der$
Konsistenz Folgendes verwenden:Hinweis:
\e[2J
Wenn Sie diese Option entfernen, wird das Flackern vermieden, es verbleiben jedoch Junk-Zeichen, wenn der Platzhalter länger als die eigentliche Eingabeaufforderung ist.quelle