bash fica sem memória

3

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.

    
por anishsane 09.01.2015 / 16:33

1 resposta

2

MAX_ARG_STRLEN aplica-se apenas ao chamar programas externos. "for" faz parte da sintaxe do bash, então o bash processará isso diretamente. E sim, ele executará o comando seq e capturará o stdout inteiro antes de executar a substituição na instrução "for".

    
por 09.01.2015 / 16:40