这个问题是一个叉子这个问题。
这是 MCVE 版本:
$ PS1='Parent-$ '
Parent-$ type seq
seq is /usr/bin/seq
Parent-$ bash
$ PS1='Child-$ '
Child-$ for i in $(seq 1000000000); do echo $i; done
bash: xrealloc: .././subst.c:5273: cannot allocate 18446744071562067968 bytes (4299235328 bytes allocated)
Parent-$ seq: write error: Broken pipe
(我更改了父子的 PS1,只是为了轻松区分它们。)
本质上,子 bash 在处理大量 seq 命令时收到内存不足错误。
这个问题显然是因为首先计算 seq 并且输出用作 for 循环的输入。
然而我的问题是:为什么它没有击中MAX_ARG_STRLEN 限制?或者这确实达到了极限吗?但如果是这样的话,故障不应该是 bash 中的 OOM...对吧?
一个可能的原因是:因为 bash 首先计算$(...)
并将其保存在内存中。评估完成后,就形成了实际命令for...
部分的命令行。但在第一步完成之前,它收到 OOM 错误。
请告诉我这种理解是否正确。
答案1
MAX_ARG_STRLEN 仅在调用外部程序时适用。 “for”是 bash 语法的一部分,因此 bash 将直接处理它。是的,它将运行 seq 命令并捕获整个标准输出,然后再执行“for”语句的替换。