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

관련 정보