Rozpoczęcie bash na moim systemie Ubuntu zajmuje około 2 sekund. Jeśli usunę ładowanie / etc / bash_completition w .bashrc, rozpocznie się ono bezzwłocznie. Oczywiście nie chcę rezygnować z ukończenia i nie sądzę, aby ładowanie tego pliku było uzasadnionym powodem 2-sekundowego opóźnienia.
Wszelkie pomysły, w jaki sposób mogę dowiedzieć się, na czym polega problem lub jak mogę przyspieszyć.
ubuntu
performance
bashrc
tab-completion
użytkownik75250
źródło
źródło
Odpowiedzi:
Aktualizacja w 2013 r .: większość ukończenia bash została przepisana na automatyczne ładowanie tylko wtedy, gdy jest to potrzebne. Podstawowy skrypt jest teraz dużo ligher.
Skrypt ukończenia może czasem być ogromny w standardach skryptów powłoki. Na jednym serwerze mam dostęp, to prawie 1700 linii (57 KB) i to tylko podstawowy skrypt . W
/etc/bash_completion.d
istnieją ~ 200 dodatkowe skrypty dla różnych innych poleceń (openssl
,mutt
,mount
...) na łączną kwotę 25537 linie lub 1,2 MB. Każdy skrypt podczas pobierania sprawdza, czy polecenie jest faktycznie dostępne, przed zdefiniowaniem procedur obsługi zakończenia; ~ 330 razy w tym przypadku, z których każdy obejmuje sprawdzenie$PATH
pliku wykonywalnego o podanej nazwie. (Chociaż spodziewałbym/usr/bin
się, że będę buforowany w pamięci ...)Trzeba przyznać, że nawet załadowanie zajmuje tylko pół sekundy, a nie dwie pełne sekundy. Ale może to być przynajmniej część problemu. Uruchom
du -hs /etc/bash_completion*
lubwc -l /etc/bash_completion{,.d/*} | grep total
jeśli chcesz to sprawdzić.Możesz spróbować ręcznie uzyskać skrypt w trybie „śledzenia”:
Zobaczysz każdą linię w trakcie jej wykonywania. Jeśli jakieś polecenie zajmuje dużo czasu, powinieneś je zauważyć.
(
set +x
wyłącza tryb śledzenia).źródło
Znalazłem nieco hackerskie rozwiązanie, które wydaje się działać dość dobrze.
Rozwiązanie
Na dole
~/.bashrc
dodaj:Wyjaśnienie
trap 'source /etc/bash_completion ; trap USR1' USR1
Skonfiguruj moduł obsługi, który będzie uruchamiany, gdy powłoka odbierze sygnał
SIGUSR1
; program obsługi załaduje uzupełnienia, a zatem sam się dezaktywuje.{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown
Asynchronicznie poczekaj chwilę, a następnie wyślij sygnał do bieżącej powłoki.
disown
jest potrzebny do stłumieniabash
informacji zwrotnych kontroli procesu.sleep
jest potrzebne do pracy asynchronicznej.Problemy
Z jakiegoś powodu pierwsze polecenie wydane dla tej powłoki nie zostanie zapisane w historii.
źródło
time bash -lc true
zgłasza ~ 0,12 s z tym lub bez niego, nawet jeślitime source /etc/bash_completion
raportuje wyższe liczby, takie jak 0,26 s. Czy udało się to skutecznie naprawić ?time bash -lc true
działa tutaj poprawnie, ponieważtrue
kończy się wcześniej,~0.1s
więc nie pobiera niczego. W każdym razietime source /etc/bash_completion
zgłasza ~ 0,17s tutaj i to jest czas, kiedy muszę czekać naPS1
pojawienie się.USR1
na końcu.Powinieneś użyć najnowszej wersji (2.0) bash_completion. Jeśli używasz Debiana, jest w wheezy, ale nie ma zależności od żadnego innego pakietu wheezy, więc możesz zainstalować go w squeeze bez problemu.
Ostatnia wersja ładuje ukończenie dynamicznie w locie, więc podzielił dla mnie szybki czas ładowania co najmniej 10 razy.
źródło
Możesz użyć symbolu zastępczego podczas ładowania ukończeń; powinno wystarczyć oszukać oczy. Działa to oczywiście tylko wtedy, gdy potrzebny czas
source /etc/bash_completion
jest krótszy niż czas potrzebny na wpisanie i wydanie pierwszego polecenia powłoki, w przeciwnym razie również zostanie opóźnione.Chodzi o to, aby powtórzyć fałszywkę
PS1
, zaopatrzyć się w uzupełnienia i wreszcie ulepszyć terminal.Załóżmy, że
PS1
tak\u@\h:\w\$
, mogą napisać coś takiego:Gdzie:
2J
usuwa terminal;H
przesuń kursor do prawego górnego rogu.Uwaga: Możesz sprawdzić, czy użytkownik jest rootem i użyć
#
zamiast$
spójności:Uwaga: Usunięcie
\e[2J
pozwala uniknąć migotania, ale pozostawi niepotrzebne znaki, jeśli symbol zastępczy jest dłuższy niż rzeczywiste pytanie.źródło