Я не понимаю, почему завершение 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).
Ответы:
Краткая версия: удаление одной строки из
/usr/local/etc/bash_completion
сокращенного времени открытия новой вкладки с десяти секунд до четверти секунды. Продолжайте читать для деталей.Я использую bash-complete из 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
проблему, когда у меня будет время. Я обновлю свой ответ, если найду лучшее решение.источник
Для тех , кто приходит к выводу , что время запуска для новых снарядов на MacOS является слишком медленным для них, этого решение .
Я только что обнаружил, что на самом деле есть два пакета, которые можно установить через
brew
. Я устанавливалbash-completion
пакет в течение многих лет, и никогда не удосужился подвергнуть его сомнению, хотя в то время я переходил с Bash 3 на 4, а теперь и на 5. Однако время от времени я возвращался к проблеме часто спотыкается об этом обсуждении StackOverflow.Там еще один пакет,
bash-completion@2
!Какая разница?
bash-completion
для Bash версии 3.2.bash-completion@2
для Bash версии 4.1+ и 5.При удалении
bash-completion
и установке старого пакетаbash-completion@2
время запуска моей оболочки сократилось с 605 до 244 мс. Это огромное улучшение скорости.Я подозреваю, что многие из нас совершают ту же ошибку, так как
brew info
статистика показывает, что у первого есть тонны установок, а у последнего так мало:Следует отметить, что в текущем выбранном ответе упоминается закомментирование некоторых строк, что обеспечивает лишь незначительное улучшение времени запуска (если используется старый
bash-completion
пакет, который, вероятно, есть у многих), но никак не влияет на новыйbash-completion@2
пакет: этот новый пакет быстро, несмотря ни на что. Это означает, что никаких взломов не требуется.TL; DR:
Не забудьте обновить исходный путь до файла завершения в вашем
.bashrc
или.bash_profile
файле.Источники:
Поскольку тема несколько связана, я часто использую
rclone
утилиту, поэтому она установлена. Он также имеет самый большой файл завершения, который я когда-либо видел . Удаление этого сокращает время запуска моей оболочки до ~ 120 мс, что очень быстро.Редактировать:
Для тех, кому нужны технические подробности, объясняющие эту проблему, я подробно писал об этом на форумах Homebrew . Подводя итог,
bash-completion@2
можно сказать , что причина, по которой это происходит намного быстрее, заключается в том, что он был написан так, чтобы больше не загружать все файлы завершения; вместо этого он загружает файл завершения по требованию, или, как описывает его автор, загружает их без лишних усилий.источник
version 3.2.57(1)-release (x86_64-apple-darwin18)
. Спасибо что подметил это; Я удалил строку из своего поста.С мыслью о том, что ответ Godbyk дал мне, я обнаружил, что моя переменная PATH имеет несколько каталогов, которые не имеют никаких двоичных файлов или не существуют, удаление их значительно ускорило его. Другими словами, это ПУТЬ, которую я имел в моем bashrc:
И тогда я изменил это на:
Это было потому, что
have
функция в этом завершении bash искала каждую команду, и у меня было слишком много бесполезных каталогов, которые нужно было посетить для каждого из этих двоичных файлов, удаление их ускорило их.источник
Я была такая же проблема. Несколько простых уловок отладки привели меня к основной причине.
Сначала включите,
DEBUG mode
чтобы увидеть, что происходит:Это позволяет выполнять подробную печать на консоли, поэтому вы можете увидеть последнюю команду. Теперь вы можете выполнить скрипт в фоновом режиме, и вы увидите, что происходит
Не берите из того
PID
, что вы можете отследить с помощьюps
илиpstree
:pstree -p <the PID>
:Как вы можете видеть, он запустил некоторые команды, связанные с ржавчиной, которые принимали целую вечность.
Временное удаление
/opt/boxen/homebrew/etc/bash_completion.d/cargo
разрешило мои симптомы.источник
Если вы используете MacPorts> = 2.1.2 и Mountain Lion, значит, вы
bash_profile
ошибаетесь. Следуйте инструкциям на Как заставить git-creation.bash работать на Mac OS X? , Я предполагаю, что это может ускорить автозаполнение.Другим решением будет попытаться установить автозаполнение через Fink или Homebrew. Если это не сработает, вы можете попробовать другую оболочку. Я обнаружил, что рыбная раковина является выдающейся, когда дело доходит до автозаполнения (из коробки). Хотя версия 2 все еще находится в бета-версии, я очень рекомендую ее.
источник
Я догадываюсь, что твой удар слишком стар. Я работаю на складе, который идет с Mountain Lion, и вот что я вижу:
источник