今天早上我对其进行了~/.bashrc
数十次更改和资源配置. ~/.bashrc
。我最后一次注意到资源配置大约需要 30 秒。
因此我做了一个快速测试:
$ time set | wc
2925 16529 572654385
real 0m8.466s
user 0m7.855s
sys 0m1.166s
如您所见,大约有 573 MB 的set
内容。转储到屏幕上时,我注意到大多数字符都是\
。所以我计算了一下出现次数,为 3.95 亿次:
$ time fgrep -o '\' <<< $(set) | wc -l
395355002
real 0m57.086s
user 0m54.015s
sys 0m4.859s
关于如何开始缩小原因范围的任何线索~/.bashrc
?
它有 626 行,太长了,无法筛选。我搜索过set -x
,set +x
但这些字符串在任何地方都没有出现。
笔记:当你打开一个新终端时set
它会小得多:
$ time set | wc
2915 9330 114104
real 0m0.010s
user 0m0.011s
sys 0m0.007s
答案1
我找到了罪魁祸首。declare -p
使用以下命令将输出保存到数组中:
mapfile -t SaveVars <<< "$(declare -p)"
每次~/.bashrc
为 分配资源时,数组的大小都会加倍, 的内容也是如此declare -p
。目前 已超过1.1 GB
:
$ 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