bash se estrelló con for loop

La pregunta puede ser trivial pero con este simple bucle

 for i in {1..10000000}; do echo "$i" line >> file done 

mi shell se bloqueó después de un time de elaboración (la pestaña en el emulador de terminal se cerró automáticamente) y el file no se creó.

Es GNU bash, version 4.1.11(2)-release .

¿Esto se debe a un límite de memory o qué más? Y si es así, ¿cuál debería ser este límite?

Con {1..1000000} funcionó correctamente.

Solutions Collecting From Web of "bash se estrelló con for loop"

La razón por la que esto ocurre es porque los corchetes se expanden antes de invocar el command. Por lo tanto, terminas con un command como:

 for i in 1 2 3 ... 10000000 ; do ... 

.. y así consume mucha memory o se bloquea.

La solución cuando se trabaja con loops largos es usar la syntax de estilo c de bash:

 for ((i = 1; i <= 10000000; i++)) do ... done 

O si desea seguir siendo compatible con otras shells, puede canalizar a un ciclo while:

 seq 1 10000000 | while IFS= read -r line do ... done 

Mi process de bash que realiza este command requiere mucha memory, sí. 1.9GB en mi caso (x86_64). Es posible que haya llegado a su límite y el asesino sin memory del kernel lo haya eliminado. Para mí, funciona sin embargo. Tarda unos 3 minutos

  $ wc -l file 10000000 file $ tail -n1 file 10000000 line $ ls -hl file -rw-r--r-- 1 seb users 123M Sep 5 13:19 file 

Para confirmar la hipótesis de la limitación de la RAM: si tiene un intercambio, puede intentar ver que se complete. Utilice, por ejemplo, htop para esto.

Si aumentas más el bucle de más de 100.000.000 de elementos, el process también consume diez veces más RAM: 18 GB.

@ user000001 da una explicación y una alternativa. Probé con la syntax de estilo C (que proporcionó):

 for ((i = 1; i <= 10000000; i++)) do ... done 

Este process no requiere más RAM que un process regular de bash.