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가 원하는 것을 수행합니다.