`seq`とbash中括弧拡張が失敗する

`seq`とbash中括弧拡張が失敗する

IINMシステムでエラーが発生した場合bashイギリス

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

または

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

しかし、いつではありません。

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

この動作の内部を簡単に説明し、タスクを完了するための回避策を提案できますか?

答え1

for i in {0..1000000}どちらもfor i in $(seq 1000000)大きなリストを作成してから繰り返します。これは非効率的で、多くのメモリを占有します。

使用:

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

代わりに。またはPOSIXとして:

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

または:

seq 1000000 | xargs...

CRLFでいっぱいのファイルを取得するには:

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

通常、シェルではループをできるだけ避ける必要があります。

答え2

@Stéphane Chazelasは上記の素晴らしい答えを提供しました。

私は答えではありません。さまざまなソリューションの効率性が気になって結果を共有する必要があると思いました...

~# i=0 ; time while [ "$i" -le 1000000 ]; do ((i++)) ;done
real    0m21.753s

~# time for ((i = 0; i<= 1000000; i++))  ;do : ;done
real    0m15.791s

~# time for i in {0..1000000} ;do : ;done
real    0m8.897s

~# time for i in $(seq 0 1000000) ;do : ;done
real    0m7.760s

:~# time seq 1000000 | xargs true
real    0m0.938s

~# time yes $'\r' | head -n 1000000 >/dev/null
real    0m0.048s

答えはyes確かな勝者です。 :-) また、実際にOPが望むことを行います。

関連情報