Запуск bash в моей системе Ubuntu занимает около 2 секунд. Если я удаляю загрузку / etc / bash_completition в .bashrc, она начинается без задержки. Конечно, я не хочу отказываться от завершения и не думаю, что загрузка этого файла является законной причиной задержки в 2 секунды.
Любые идеи, как я могу узнать, в чем проблема или как я могу ускорить процесс.
ubuntu
performance
bashrc
tab-completion
user75250
источник
источник
Ответы:
Обновление в 2013 году: большая часть завершения bash была переписана для завершения автозагрузки только при необходимости. Базовый сценарий теперь намного легче.
Скрипт завершения иногда может быть огромным в стандартах сценария оболочки. На одном сервере, к которому у меня есть доступ, это почти 1700 строк (57 КБ), и это только основной скрипт . В
/etc/bash_completion.d
есть ~ 200 дополнительные скрипты для различных других команд (openssl
,mutt
,mount
...) на общую сумму 25537 линий или 1,2 МБ. Каждый сценарий, когда он получен, проверяет, действительно ли команда доступна, прежде чем определять обработчики завершения; ~ 330 раз в этом случае, каждый из которых включает проверку$PATH
исполняемого файла с заданным именем. (Хотя я ожидаю,/usr/bin
что будет кешироваться в памяти ...)По общему признанию, даже это занимает только полсекунды для загрузки, а не две полных секунды. Но это может быть хотя бы частью проблемы. Запустите
du -hs /etc/bash_completion*
или,wc -l /etc/bash_completion{,.d/*} | grep total
если вы хотите проверить.Вы можете попробовать поискать скрипт вручную в режиме «трассировки»:
Вы увидите каждую строку, как она выполняется. Если есть определенная команда, которая занимает много времени, вы должны это заметить.
(
set +x
отключает режим трассировки.)источник
Я нашел немного хакерское решение, которое, кажется, работает достаточно.
Решение
Внизу
~/.bashrc
добавить:объяснение
trap 'source /etc/bash_completion ; trap USR1' USR1
Настройте обработчик для запуска, когда оболочка получает сигнал
SIGUSR1
; обработчик загрузит завершения и, следовательно, деактивирует себя.{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown
Асинхронно немного подождите, затем отправьте сигнал текущей оболочке.
disown
необходим для подавленияbash
обратной связи управления процессом.sleep
нужно работать асинхронно.Проблемы
По какой-то причине первая команда, выданная этой оболочке, не будет записана в историю.
источник
time bash -lc true
сообщает о ~ 0.12 с или без, даже приtime source /etc/bash_completion
том, что сообщает более высокие числа, как 0.26. Это было эффективно исправлено ?time bash -lc true
работает ли здесь правильно, так какtrue
заканчивается раньше,~0.1s
поэтому ничего не получается. В любом случае, здесьtime source /etc/bash_completion
сообщается ~ 0,17 с, и это примерно то время, когда мне нужно ждатьPS1
появления.USR1
в конце.Вы должны использовать последнюю версию (2.0) bash_completion. Если вы используете Debian, он находится в wheezy, но он не зависит от любого другого пакета wheezy, поэтому вы можете установить его без проблем.
Самая последняя версия загружает завершение динамически на лету, поэтому оно делило для меня время быстрой загрузки по крайней мере в 10 раз.
источник
Вы можете использовать заполнитель во время загрузки завершений; этого должно быть достаточно, чтобы обмануть ваши глаза. Это, очевидно, работает, только если время, которое требуется,
source /etc/bash_completion
меньше, чем время, необходимое вам для ввода и выдачи первой команды оболочки, в противном случае оно также будет отложено.Идея состоит в том, чтобы повторить подделку
PS1
, получить завершение и, наконец, ослабить терминал.Предположим , что ваш
PS1
есть\u@\h:\w\$
, они вы могли бы написать что - то вроде:Где:
2J
стирает терминал;H
переместите курсор в верхний правый угол.Примечание. Возможно, вы захотите проверить, является ли пользователь root, и использовать его
#
вместо$
согласованности:Примечание. При удалении можно
\e[2J
избежать мерцания, но в нем останутся ненужные символы, если заполнитель будет длиннее, чем фактическое приглашение.источник