Nie rozumiem, dlaczego ukończenie bash jest tak wolno ładowane na moim MacBooku Pro.
Wykonałem następujące czynności w moim ~/.bash_profile
:
echo "Loading BashCompletion..."
if [ -f /opt/local/etc/bash_completion ]; then
. /opt/local/etc/bash_completion
fi
echo "BashCompletion loaded."
czas wykonania dla bash_completion zwykle wynosi> 2 sekundy.
Uważam to za bardzo denerwujące, gdy pracuję nad terminalem, który wymaga ode mnie ciągłego otwierania nowych kart.
Czy jest jakiś sposób, że mogę to buforować?
(Uwaga: Używam iTerm2 i jest to równie powolne na oryginalnym terminalu w Macu).
Odpowiedzi:
Wersja skrócona: Usunięcie pojedynczej linii ze
/usr/local/etc/bash_completion
skrócenia czasu otwierania nowej karty z dziesięciu sekund do ćwierć sekundy. Czytaj dalej, aby poznać szczegóły.Korzystam z bash-uzupełniania z homebrew i napotkałem ten sam problem. Załadowanie skryptów kończących bash trwało ponad dziesięć sekund za każdym razem, gdy otwierałem terminal.
Przez większość czasu wydaje się, że zajmuje go pojedynczy wiersz
have()
funkcji: wywołanie wtype
celu ustalenia, czy program wiersza poleceń jest zainstalowany.Przy domyślnej
have()
funkcji i wszystkich dostarczonych skryptach kończących bash, załadowanie skryptów zajmie 10.561s (zgłaszane przez prefikstime
do. /opt/local/etc/bash_completion
linii w moim.bash_profile
pliku).Po skomentowaniu
PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&
wiersza mojego/usr/local/etc/bash_completion
skryptu (opuszczeniehave=yes
wiersza, otwarcie nowego terminala zajmuje tylko 0,258 s. Czas ten można dodatkowo skrócić, usuwając niepotrzebne skrypty ukończenia (dowiązania symboliczne) z/usr/local/etc/bash_completion.d
katalogu.Nie wiem, dlaczego wezwanie do
type
tak długo trwa. Sprawdzam to później.Jednym potencjalnym minusem tego podejścia jest to, że spowoduje załadowanie funkcji uzupełniania bashu do pamięci, nawet jeśli nie będziesz z nich korzystać. Te
have()
kontrole funkcyjne, aby zobaczyć, czy jest zainstalowany polecenia lub aplikacji. Jeśli tak nie jest, skrypt zakończenia generalnie decyduje się nie zawracać sobie głowy ładowaniem, ponieważ nie będzie to przydatne.W tej chwili jestem zadowolony z kompromisu, ale będę nadal badał
type
problem, gdy będę miał czas. Zaktualizuję swoją odpowiedź, jeśli znajdę lepsze rozwiązanie.źródło
Dla każdego, kto dojdzie do wniosku, że czasy uruchamiania nowych powłok w systemie MacOS są dla nich zbyt wolne, jest to rozwiązanie .
Właśnie odkryłem, że w rzeczywistości istnieją dwa pakiety, które można zainstalować
brew
. Instalujębash-completion
pakiet od lat i nigdy nie zadałem sobie trudu, aby go zakwestionować, mimo że w tym czasie przeszedłem z Bash 3, 4, teraz 5. Jednak od czasu do czasu wracam do problemu , często napotykam na tę dyskusję StackOverflow.Jest kolejna paczka
bash-completion@2
!Co za różnica?
bash-completion
dotyczy wersji Bash 3.2.bash-completion@2
dotyczy wersji Bash 4.1+ i 5.Po usunięciu starego
bash-completion
pakietu i zainstalowaniubash-completion@2
mój czas uruchamiania powłoki spadł z 605 ms do 244 ms. To ogromna poprawa prędkości.Podejrzewam, że wielu z nas popełnia ten sam błąd, ponieważ
brew info
statystyki pokazują, że ten pierwszy ma mnóstwo instalacji, podczas gdy drugi ma tak mało:Należy zauważyć, że obecnie wybrana odpowiedź wspomina o komentowaniu niektórych wierszy, co zapewnia jedynie niewielką poprawę czasów uruchamiania (jeśli używa się starego
bash-completion
pakietu, którym prawdopodobnie wielu jest), ale nie ma żadnego wpływu na nowybash-completion@2
pakiet: ten nowy pakiet jest szybki bez względu na wszystko. Oznacza to, że nie wymaga hackowania.TL; DR:
Pamiętaj, aby zaktualizować ścieżkę źródłową do pliku zakończenia w pliku
.bashrc
lub.bash_profile
pliku.Źródła:
Jako temat nieco powiązany,
rclone
często używam tego narzędzia, więc jest zainstalowane. Zdarza się również, że ma największy plik ukończenia, jaki kiedykolwiek widziałem . Usunięcie go skraca czas uruchamiania mojej powłoki do ~ 120 ms, co jest bardzo szybkie.Edytować:
Dla każdego, kto chce poznać szczegóły techniczne wyjaśniające ten problem, pisałem o tym obszernie na forach Homebrew . Podsumowując, powodem, który
bash-completion@2
jest o wiele szybszy, jest to, że został napisany tak, że nie chętnie ładuje już wszystkich plików ukończenia; zamiast tego ładuje plik ukończenia na żądanie lub, jak opisuje go autor, ładuje je w nieskory sposób.źródło
version 3.2.57(1)-release (x86_64-apple-darwin18)
. Dzięki za zwrócenie na to uwagi; Usunąłem wiersz z mojego postu.Dzięki pomysłowi, który dał mi odpowiedź godbyk, odkryłem, że moja zmienna PATH miała kilka katalogów, które nie miały żadnych plików binarnych lub nie istniały, co znacznie je przyspieszyło. Innymi słowy, jest to ŚCIEŻKA, którą miałem w moim bashrc:
A potem zmieniłem to na:
Stało się tak, ponieważ
have
funkcja w tym zakończeniu bashu szukała każdego polecenia, a ja miałem zbyt wiele bezużytecznych katalogów, które miały być odwiedzane dla każdego z tych plików binarnych, co spowodowało ich przyspieszenie.źródło
Miałem ten sam problem. Kilka prostych sztuczek debugowania doprowadziło mnie do głównej przyczyny.
Najpierw włącz,
DEBUG mode
aby zobaczyć, co się dzieje:Umożliwia to pełne drukowanie na konsoli, dzięki czemu można zobaczyć ostatnie polecenie. Możesz teraz wykonać skrypt w tle, a zobaczysz, co się dzieje
Nie bierz tego
PID
, co możesz następnie śledzić za pomocąps
lubpstree
:pstree -p <the PID>
:Jak widać, uruchomiono kilka poleceń związanych z rdzą, które trwały wieki.
Tymczasowe usunięcie
/opt/boxen/homebrew/etc/bash_completion.d/cargo
rozwiązało moje objawy.źródło
Jeśli korzystasz z MacPorts> = 2.1.2 i Mountain Lion, to wygląda na to, że się
bash_profile
mylisz. Postępuj zgodnie z instrukcjami na stronie Jak uzyskać git-uzupełnianie.bash do pracy w systemie Mac OS X? . Zakładam, że może to przyspieszyć automatyczne uzupełnianie.Innym rozwiązaniem może być próba zainstalowania autouzupełniania za pośrednictwem Fink lub Homebrew. Jeśli to nie zadziała, możesz wypróbować inną powłokę. Przekonałem się, że skorupa ryb jest wyjątkowa, jeśli chodzi o automatyczne uzupełnianie (po wyjęciu z pudełka). Chociaż wersja 2 jest wciąż w fazie beta, bardzo ją polecam.
źródło
Domyślam się, że twoja bata jest za stara. Używam bashu giełdowego, który przyszedł z Mountain Lion i oto, co widzę:
źródło