'seq' e falha de expansão do suporte bash

5

O meu sistema IINM está falhando quando bash ing

for i in {0..10000000}; #   Seven zeroes.
do
    false;
done #   'bash' exited and its 'tmux' pane/window was closed.

ou

for i in $(seq 0 10000000); #   Seven zeroes.
do
    false;
done #   'bash' exited and its 'tmux' pane/window was closed.

mas não quando

for i in {0..1000000}; #   Six zeroes.
do
    false;
done #   Finished correctly.

Por favor, você pode explicar brevemente os aspectos internos deste comportamento e solicitar uma solução para realizar a tarefa?

    
por uprego 27.08.2014 / 14:24

1 resposta

9

for i in {0..1000000} e for i in $(seq 1000000) criam uma lista grande e passam por cima dela. Isso é ineficiente e usa muita memória.

Uso:

for ((i = 0; i<= 1000000; i++))

em vez disso. Ou POSIXly:

i=0; while [ "$i" -le 1000000 ]; do
  ...
  i=$(($i + 1))
done

Ou:

seq 1000000 | xargs...

Para obter um arquivo cheio de CRLFs:

yes $'\r' | head -n 1000000 >  file

Geralmente, os loops devem ser evitados sempre que possível em shells.

    
por 27.08.2014 / 14:29