Esta questão é uma bifurcação de esta pergunta SO .
Aqui está a versão do 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
(Eu mudei o PS1 de pai e filho apenas para diferenciá-los facilmente.)
Essencialmente, o filho bash recebe um erro de falta de memória ao processar o comando seq com um grande número.
Este problema é obviamente porque seq é calculado primeiro & essa saída é usada como entrada para o loop for.
A minha pergunta é, no entanto: por que não atingiu limite de MAX_ARG_STRLEN ? Ou isso está realmente atingindo esse limite?
Mas se for esse o caso, a falha não deve ser uma OOM em bash ... Certo?
Um possível motivo é: porque o bash primeiro calcula $(...)
& mantenha na memória. Depois que a avaliação estiver concluída, ela formará a linha de comando para o comando real - for...
part. Mas antes que o primeiro passo seja concluído, ele recebe um erro OOM.
Deixe-me saber se esse entendimento está correto.