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 脚本语言对于此类任务很少有效。