for i in {0..999999999}; do echo "hi"; done
需要很长时间才能写入它的输出,就好像所有的echo
s 首先执行然后发送到stdout
.cowfortune
使用 代替效果更加明显,echo
并且使终端缓冲不太可能成为问题。
那么,当我一步步执行上述命令时,到底会发生什么?为什么会延迟?
答案1
普通for
循环总是迭代一组静态字符串。这与字符串是由大括号扩展还是由文件名通配模式生成,或者变量或命令替换的其他扩展等生成无关。
对于for
循环,您可以使用大括号扩展生成要循环的字符串。在循环的第一次迭代运行之前,必须先展开大括号展开。由于您生成如此庞大的单词列表(每个单词都是 0 到 999999999 范围内的 10 亿个整数),这可能需要一些时间(并且可能需要超过 8 GB 的 RAM)。
如果您确实需要在 中进行此类迭代bash
,请改用算术for
循环:
for (( i=0; i <= 999999999; ++i )); do echo hi; done
...或以其他方式解决特定问题
yes hi | head -n 1000000000
...或者考虑使用几乎任何其他语言来完成您手头的任务,因为 shell 脚本语言对于此类任务很少有效。