Я принимал изменения в ~ / .bashrc
и ресурсы его десятки раз с . ~ / .bashrc
сегодня утром. В последний раз я заметил, что он принимал около 30 секунд для источника файла.
Итак, я сделал быстрый тест:
$ time set | wc
2925 16529 572654385
real 0m8.466s
user 0m7.855s
sys 0m1.166s
, как видно, есть около 573 МБ набора
. Сброс на экран, я заметил, что большинство персонажей \
. Итак, я посчитал возникновение, которое составляет 395 миллионов раз:
$ time fgrep -o '\' <<< $(set) | wc -l
395355002
real 0m57.086s
user 0m54.015s
sys 0m4.859s
любые подсказки на том, как начать сужение по причине в ~ / .bashrc
?
Это 626 строк длиной и слишком долго для кого-то, чтобы просеять через. Я искал set -x
и набор + x
, но эти строки не встречаются нигде.
Примечание: , когда вы открываете новый терминал
намного меньше:
$ time set | wc
2915 9330 114104
real 0m0.010s
user 0m0.011s
sys 0m0.007s
I found the culprit. Вывод из declare -p
записывался в массив командой:
mapfile -t SaveVars <<< "$(declare -p)"
Каждый раз, когда на ~/.bashrc
выделялись ресурсы, массив увеличивался в два раза, также как и содержимое declare -p
. В настоящее время более 1.1 Гб
:
$ declare -p | wc
123 8179 1,103,480,262
ПРИМЕЧАНИЕ: Добавлены запятые (,
) для удобочитаемости.
Вставка одной строки для опустошения массива (и, конечно, соответствующей строки комментария) приводит к тому, что:
# Empty array to prevent doubling everytime ~/.bashrc is resourced
SaveVars=()
# Save variable list before user creates new ones in shell
mapfile -t SaveVars <<< "$(declare -p)"
После этого исправления размер переменных остается неизменным после выделения:
$ declare -p | wc
120 1008 30529
$ . ~/.bashrc
$ declare -p | wc
120 1008 30529