bash 循环如何精确工作?

Vor*_*rac 6 bash brace-expansion for

for i in {0..999999999}; do echo "hi"; done
Run Code Online (Sandbox Code Playgroud)

写它的输出需要很长时间,好像所有的echos 都先执行然后发送到stdout. 使用cowfortune而不是效果更加明显,echo并且使得终端缓冲不太可能成为问题。

那么,当我一步一步执行上述命令时,究竟发生了什么?为什么会延迟?

Kus*_*nda 25

普通for循环总是迭代一组静态字符串。这与字符串是由大括号扩展或文件名通配模式生成的,还是变量或命令替换的其他扩展等无关。

对于您的for循环,您可以使用大括号扩展生成要循环的字符串。在循环的第一次迭代可以运行之前,必须扩展大括号扩展。由于您生成如此庞大的单词列表(0 到 999999999 范围内的十亿个整数中的每一个),这可能需要一些时间(可能需要超过 8 GB 的 RAM)。

如果您确实需要在 中进行这种迭代bash,请改用算术for循环:

for (( i=0; i <= 999999999; ++i )); do echo hi; done
Run Code Online (Sandbox Code Playgroud)

...或以其他方式解决特定问题

yes hi | head -n 1000000000
Run Code Online (Sandbox Code Playgroud)

... 或者考虑使用几乎任何其他语言来完成您手头的任务,因为 shell 脚本语言对于此类任务很少有效。

  • 这十亿个数字中的 90% 是 9 位长,因此,存储为 shell 单词所在的字符串,我认为应该已经大约 8 GB。加上几 GB 用于簿记,我想。无论如何,在我的 4 GB(+ 8 GB 交换)系统上,它只是失败了“bash:括号扩展:无法为 1000000000 个元素分配内存”...... (6认同)