bash 因 for 循环而崩溃

Bow*_*ark 6 shell bash shell-script crash

这个问题可能是微不足道的,但有了这个简单的for循环

for i in {1..10000000}; do echo "$i" line >> file
done
Run Code Online (Sandbox Code Playgroud)

我的外壳在经过一些精化时间后崩溃了(终端模拟器中的选项卡被自动关闭)并且file没有被创建。

它是GNU bash, version 4.1.11(2)-release

这是由于内存限制还是其他原因?如果是,这应该是这个限制吗?

随着{1..1000000}它工作正常。

use*_*001 7

发生这种情况的原因是因为在调用命令之前扩展了括号。因此,您实际上最终会得到如下命令:

for i in 1 2 3 ... 10000000 ; do ... 
Run Code Online (Sandbox Code Playgroud)

..因此它会占用大量内存或崩溃。

处理长循环时的解决方案是使用 bash 的 c 样式语法:

for ((i = 1; i <= 10000000; i++))
do 
    ...
done
Run Code Online (Sandbox Code Playgroud)

或者,如果您想与其他 shell 保持兼容,您可以通过管道连接到 while 循环:

seq 1 10000000 | while IFS= read -r line
do
     ...
done
Run Code Online (Sandbox Code Playgroud)