13

Я не понимаю, почему завершение bash загружается так медленно на моем MacBook Pro.

Я сделал следующее в моем ~/.bash_profile:

echo "Loading BashCompletion..."
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi
echo "BashCompletion loaded."

время выполнения bash_completion обычно составляет> 2 секунды.

Я нахожу это действительно раздражающим, когда я работаю над терминалом, который требует от меня постоянно открывать новые вкладки.

Есть ли способ, которым я могу кэшировать это или что-то?

(Обратите внимание, что я использую iTerm2, и это также медленно на оригинальном терминале в Mac).

6 ответов6

7

Краткая версия: удаление одной строки из /usr/local/etc/bash_completion сократило время открытия новой вкладки с десяти секунд до четверти секунды. Читайте дальше для деталей.

Я использую bash-дополнение от homebrew и столкнулся с той же проблемой. Загрузка скриптов завершения bash заняла более десяти секунд каждый раз, когда я открывал терминал.

Кажется, что большую часть этого времени занимает одна строка в функции have() : вызов type для определения, установлена ли программа командной строки.

При наличии функции have() по умолчанию и всех предоставленных сценариев завершения bash для загрузки сценариев потребуется 10,561 с (сообщается с указанием time префикса в строке. . /opt/local/etc/bash_completion в моем файле .bash_profile .

После комментирования PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null && строки моего сценария /usr/local/etc/bash_completion (оставив команду have=yes линия, открытие нового терминала занимает всего 0,258 с. Это время можно еще больше сократить, удалив ненужные сценарии завершения (символические ссылки) из каталога /usr/local/etc/bash_completion.d .

Я не знаю, почему вызов type так долго. Я расследую это дальше.

Одним из потенциальных недостатков этого подхода является то, что он приведет к загрузке функций завершения bash в память, даже если вы их не используете. Функция have() проверяет, установлена ли команда или приложение. Если это не так, скрипт завершения обычно решает не загружать себя, потому что он будет бесполезен.

На данный момент я доволен компромиссом, но я буду продолжать исследовать проблему type когда у меня будет время. Я обновлю свой ответ, если найду лучшее решение.

2

С мыслью о том, что ответ Godbyk дал мне, я обнаружил, что моя переменная PATH имеет несколько каталогов, которые не имеют никаких двоичных файлов или не существуют, удаление их значительно ускорило его. Другими словами, это ПУТЬ, которую я имел в моем bashrc:

PATH="$GOPATH/bin:/some/directory/not/existing:/some/empty/directory:/some/directory/without/binaries:$PATH"

И тогда я изменил это на:

PATH="$GOPATH/bin:$PATH"

Это было потому have что у меня была функция в этом завершении bash, я искал каждую команду, и у меня было слишком много бесполезных каталогов, которые нужно было посетить для каждого из этих двоичных файлов, удаление их ускорило их.

2

Для тех , кто приходят к выводу , что время запуска новых снарядов на MacOS слишком медленно для них это решение.

Я только что обнаружил, что на самом деле есть два пакета, которые можно установить через brew . Я годами устанавливал пакет bash-completion и никогда не задумывался об этом, хотя за это время я перешел с Bash 3 на 4 и теперь на 5. Время от времени, тем не менее, я возвращался к проблеме, часто натыкаясь на это самое обсуждение StackOverflow.

Есть еще один пакет, bash-completion@2 !

Какая разница? bash-completion для Bash версии 3.2. bash-completion@2 extension @ 2 предназначен для Bash версии 4.1+ и 5. MacOS уже давно поставляется с Bash> 4.1.

При удалении старого пакета bash-completion и установка bash-completion@2 мое время запуска оболочки упала с 605ms до 244ms. Это огромное улучшение скорости.

Я подозреваю, что многие из нас совершают эту же ошибку, так как статистические brew info показывают, что у первого есть тонны установок, а у последнего так мало:

Следует отметить, что текущий выбранный ответ упоминает закомментирование некоторых строк, что обеспечивает лишь незначительное улучшение времени запуска (если используется старый пакет bash-completion , который, вероятно, есть у многих), но никак не влияет на новый bash-completion@2 : новый пакет быстрый, несмотря ни на что. Это означает, что никаких взломов не требуется.

TL; DR:

brew uninstall bash-completion && brew install bash-completion@2

Не забудьте обновить исходный путь до файла завершения в файле .bashrc или .bash_profile .

Источники:


Поскольку тема несколько связана, я часто использую утилиту rclone , поэтому она установлена. Он также имеет самый большой файл завершения, который я когда-либо видел. Удаление этого сокращает время запуска моей оболочки до ~ 120 мс, что очень быстро.


Редактировать:

Для тех, кому нужны технические подробности, объясняющие эту проблему, я подробно писал об этом на форумах Homebrew. Подводя итог, причина того, что bash-completion@2 намного быстрее происходит потому , что была написана так , что она больше не охотно не загружает все файлы завершения; вместо этого он загружает файл завершения по требованию, или, как описывает его автор, загружает их без лишних усилий.

0

Я была такая же проблема. Несколько простых приемов отладки привели меня к основной причине.

Сначала включите DEBUG mode чтобы увидеть, что происходит:

export BASH_COMPLETION_DEBUG=true

Это позволяет выполнять подробную печать на консоли, поэтому вы можете увидеть последнюю команду. Теперь вы можете выполнить скрипт в фоновом режиме, и вы увидите, что происходит

. /opt/local/etc/bash_completion &

Не берите PID , который можно затем отследить с помощью ps или pstree:

pstree -p <the PID>:

| |     \-+= 82095 mfellows -bash
| |       \-+- 82103 mfellows -bash
| |         |-+- 82104 mfellows cargo --list
| |         | \--- 82106 mfellows rustc -vV --cap-lints allow

Как вы можете видеть, он запустил некоторые команды, связанные с ржавчиной, которые принимали целую вечность.

Временное удаление /opt/boxen/homebrew/etc/bash_completion.d/cargo разрешило мои симптомы.

-1

Если вы используете MacPorts> = 2.1.2 и Mountain Lion, значит, ваш bash_profile неправильный. Следуйте инструкциям на Как заставить git-creation.bash работать на Mac OS X? , Я предполагаю, что это может ускорить автозаполнение.

Другим решением будет попытаться установить автозаполнение через Fink или Homebrew. Если это не сработает, вы можете попробовать другую оболочку. Я обнаружил, что рыбная раковина является выдающейся, когда дело доходит до автозаполнения (из коробки). Хотя версия 2 все еще находится в бета-версии, я очень рекомендую ее.

-1

Я собираюсь догадаться, что ваш удар слишком стар. Я работаю на фондовом рынке вместе с Mountain Lion, и вот что я вижу:

$ port info bash-completion
bash-completion @2.0, Revision 1 (sysutils)

Description:          Programmable completion library for bash. This port
                      **requires bash >=4.1** and is meant to be used together with
                      the bash port.
Homepage:             http://bash-completion.alioth.debian.org/

Runtime Dependencies: bash
Conflicts with:       bash-completion-devel
Platforms:            darwin
License:              GPL-2+
Maintainers:          raimue@macports.org

$ bash --version
GNU bash, version **3.2.48(1)-release (x86_64-apple-darwin12)**
Copyright (C) 2007 Free Software Foundation, Inc.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .