为什么这个简单的 shell 循环会停止并开始消耗大量内存?

为什么这个简单的 shell 循环会停止并开始消耗大量内存?

我的一个朋友以不人道地对待机器而闻名,他想给他们的 CPU 施加压力,因此写了这样的一句话:

for z in {1..100000000};do num1=$(($z * $z)) && echo $num1;done

执行时,此循环没有任何输出,快速查看top会发现 bash 消耗了大量内存(千兆字节几分钟后)。

如上所述,我希望这个过程按顺序运行 - 如传入变量z、计算、回显结果、重复。

相反,尝试使用较小的上限会使其看起来好像一切都是经过计算的前面,然后转储到屏幕上集体。例如,它会先进行一段时间的计算,然后echo一次性完成所有操作。

这个循环为何会出现这样的行为?

答案1

正如所描述的这里,范围运算符会先构建范围(创建一个整数数组),然后才允许您对其进行迭代等操作。使用 while 循环可能会更好:

 z=1 ; while [[ $z -le 100000000 ]] ; do num1=$(($z * $z)) && echo $num1 ; z=$(($z + 1)) ; done

(尽管这不太可能真正给 CPU 带来压力,因为回声会带来一些缓解。我自己的系统在运行此程序时仅达到约 30% 的利用率。)

相关内容