set 命令输出为 573 MB

set 命令输出为 573 MB

今天早上我对其进行了~/.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 -xset +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

相关内容