for i in {0..999999999}; do echo "hi"; done
echo
모든 s가 먼저 실행된 다음 으로 전송되는 것처럼 출력을 작성하는 데 시간이 오래 걸립니다 stdout
. cowfortune
대신 사용하면 더 눈에 띄는 효과가 있으며 echo
터미널 버퍼링이 문제가 될 가능성이 줄어듭니다.
그렇다면 위의 명령을 단계별로 실행하면 정확히 어떤 일이 발생할까요? 왜 지연되나요?
답변1
일반 for
루프는 항상 정적 문자열 집합을 반복합니다. 문자열이 중괄호 확장이나 파일 이름 글로빙 패턴, 기타 변수 확장 또는 명령 대체 등에 의해 생성되는지 여부는 중요하지 않습니다.
루프 의 경우 for
중괄호 확장을 사용하여 반복할 문자열을 생성할 수 있습니다. 중괄호 확장은 루프의 첫 번째 반복이 실행되기 전에 완료되어야 합니다. 매우 큰 단어 목록(각 단어는 0~999999999 범위의 10억 개의 정수임)을 생성하므로 시간이 걸릴 수 있습니다(8GB 이상의 RAM이 필요할 수 있음).
에서 이러한 종류의 반복을 실제로 수행해야 하는 경우 대신 bash
산술 for
루프를 사용하십시오.
for (( i=0; i <= 999999999; ++i )); do echo hi; done
...또는 특정 문제를 해결합니다.
yes hi | head -n 1000000000
...또는 현재 작업에 거의 모든 다른 언어를 사용하는 것을 고려해보세요. 쉘 스크립팅 언어는 그러한 작업에 거의 효과적이지 않기 때문입니다.