Все ответы относятся к более старым версиям bash_completion, и не имеют никакого отношения к недавним bash_completion
.
Современные bash_completion переехал большинство файлов заканчивания к /usr/share/bash-completion/completions
по умолчанию, проверьте путь на вашей системе, запустив
# pkg-config --variable=completionsdir bash-completion
/usr/share/bash-completion/completions
Есть много файлов там, по одному для каждой команды, но это не проблема , так как они загружаются по требованию при первом использовании с каждой командой. Старый /etc/bash_completion.d
по-прежнему поддерживается для совместимости, и все файлы оттуда загружаются при запуске bash_completion
.
# pkg-config --variable=compatdir bash-completion
/etc/bash_completion.d
Используйте этот скрипт, чтобы проверить, остались ли в старой директории устаревшие файлы.
#!/bin/sh
COMPLETIONS_DIR="$(pkg-config --variable=completionsdir bash-completion)"
COMPAT_DIR="$(pkg-config --variable=compatdir bash-completion)"
for file in "${COMPLETIONS_DIR}"/*; do
file="${COMPAT_DIR}/${file#${COMPLETIONS_DIR}/}"
[ -f "$file" ] && printf '%s\n' $file
done
Он выводит список файлов в директории Compat, которые также присутствуют в новее (по требованию) доработок реж. Если у вас нет конкретных причин, чтобы сохранить некоторые из них, просмотрите, создайте резервную копию и удалите все эти файлы.
В результате совместимый каталог должен быть в основном пустым.
Теперь, для самой интересной части - проверка, почему bash
запуск медленный. Если вы только запустили bash
, он запустит не-логин, интерактивный shell - этот на источнике Cygwin /etc/bash.bashrc
, а затем ~/.bashrc
. Это, скорее всего, не включает завершение bash, если вы не используете его из одного из rc-файлов. Если вы запустите bash -l
(bash --login
), начните Cygwin Terminal
(зависит от cygwin.bat
), или войти в систему с помощью SSH, он начнет входа в систему, интерактивную оболочку - которая будет источником /etc/profile
, ~/.bash_profile
, и вышеупомянутые радиоуправляемые файлы. Сам сценарий /etc/profile
выводит все исполняемые файлы .sh
в /etc/profile.d
.
Вы можете проверить, как долго каждый файл переходит в исходный код. Найти этот код в /etc/profile
:
for file in /etc/profile.d/*.$1; do
[ -e "${file}" ] && . "${file}"
done
Назад его, а затем заменить его следующим образом:
for file in /etc/profile.d/*.$1; do
TIMEFORMAT="%3lR ${file}"
[ -e "${file}" ] && time . "${file}"
done
bash
Start, и вы увидите, как долго каждый файл взял. Исследуйте файлы, которые занимают значительное количество времени. В моем случае это были bash_completion.sh
и fzf.sh
(fzf - нечеткий искатель, действительно приятное дополнение к bash_completion). Теперь выбор состоит в том, чтобы отключить его или продолжить исследование. Поскольку я хотел продолжать использовать fzf
ярлыки в bash, я исследовал, нашел источник замедления, оптимизировал его и отправил свой патч в репозиторий fzf (надеюсь, он будет принят).
Настоящее имя для самого большого времени spender - bash_completion.sh
. В основном это источники сценариев /usr/share/bash-completion/bash_completion
. Я сделал резервную копию этого файла, а затем отредактировал его. На последней странице есть for
цикл, который отправляет все файлы в compat
dir - /etc/bash_completion.d
. Опять же, я добавил TIMEFORMAT
и time
и увидел, какой сценарий вызывает медленный запуск. Это было zzz-fzf
(fzf
). Я исследовал и нашел подоболочку ($()
), выполняемую несколько раз в цикле for
, переписал эту часть без использования подоболочки, что ускоряет работу скрипта. Я уже отправил свой патч в репозиторий fzf.
Самая большая причина для всех этих замеров: fork
не поддерживается технологией Windows, Cygwin отлично справляется с этим, но это очень медленно, по сравнению с реальной UNIX. Подселл или конвейер, который очень мало работает сам, тратит большую часть времени выполнения на fork
-ing. Например. сравните время выполнения time echo msg
(0.000s на моем Cygwin) против time echo $(echo msg)
(0.042s на моем Cygwin) - день и ночь. Команда echo
сама по себе не делает сколько-нибудь заметного времени для выполнения, но создание подоболочки очень дорого. В моей системе Linux эти команды занимают соответственно 0,000 и 0,001. Многие пакеты Cygwin разрабатываются людьми, которые используют Linux или другую UNIX, и могут работать на Cygwin без изменений.Поэтому, естественно, эти разработчики могут свободно использовать подоболочки, конвейеры и другие функции везде, где это удобно, так как они не ощущают существенной производительности в своей системе, но на Cygwin эти сценарии оболочки могут работать в десятки и сотни раз медленнее.
Нижняя строка, если скрипт оболочки работает медленно в Cygwin - попробуйте найти источник fork
звонков и переписать сценарий, чтобы устранить их как можно больше. . cmd="$(printf "$1" "$2")"
(использует одну вилку для подоболочки) можно заменить на printf -v cmd "$1" "$2"
.
Мальчик, он вышел очень долго. Любые люди, которые до сих пор читают здесь, являются настоящими героями. Спасибо :)
Вы, кажется, задаете две проблемы: у bash есть '--startuptime', и что происходит с этим .bashrc. Вам лучше повезти, задавая каждый вопрос отдельно, и для второго вопроса, объясняя, что конкретно идет не так. –
Я не мог найти опцию '--startuptime' для bash где-нибудь на странице man, а также в Интернете. Я думаю, эти вопросы идут вместе, поэтому я спросил их вместе. – Forethinker
@me_and: Я думаю, вы правы. Я должен был их разделить. Я изменю свой вопрос соответствующим образом. – Forethinker