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が望むことを行います。