파일 크기가 주어지면 bash while 루프가 중단됩니다.

파일 크기가 주어지면 bash while 루프가 중단됩니다.

그래서 나는 이 책을 샀다.소수와 프로그래밍, 진행이 매우 어렵습니다. 오늘 나는 1장에서 설명한 (간단한) 프로그램을 작성했습니다:

#!/usr/bin/env python

import math

def find_gcd(a,b):
    while b > 0:
        r = a - b * math.floor(a/b)
        a = b
        b = r
    return int(a)

if __name__ == "__main__":
    import random, sys
    while True:
        print find_gcd(random.randrange(int(sys.argv[1])), random.randrange(int(sys.argv[2])))

...지금은 이렇게 불렀습니다.

./gcd-rand.py 10000 10000 > concievablyreallyhugefile

...지금 저는 bash엄청나게 큰 파일이 특정 크기에 도달하면 한 줄이 끊어지는 꿈을 꾸고 있습니다. 나는 그것이 다음과 같이 보일 것이라고 상상합니다.

while $(du -h f) < 32M; do ./gcd-rand.py 10000 10000 > $f; done

...하지만 저는 이전에 while 루프를 작성한 적이 없으며 bash구문이 어떻게 작동하는지 잘 모릅니다.

답변1

비결은 test 명령 test이나 이에 상응하는 명령을 사용하는 것입니다 [ ... ].

 while [ "$(du -m f|cut -f1)" -lt 32 ]
 do 
  ./gcd-rand.py 10000 10000 > "$f"
 done

자세한 내용은 을 참조하세요 help test.

노트

test또는 [명령은 bash입니다.내장. 도움말 정보는 bash를 통해 help test또는 bash 내에서 검색할 수 있습니다 help [. 쉘에 해당 명령이 없는 경우 사용되는 명령을 man test나타냅니다 .test내장또는 명시적으로 로 호출됩니다 /usr/bin/test.

답변2

./gcd-rand.py 10000 10000 | head -c 32M > concievablyreallyhugefile

head32MB 이후에는 읽기가 중지됩니다. head읽기를 중단한 직후 다음 gcd-rand.py메시지를 받게 됩니다.신호 파이프라인신호를 보내고 나가세요.

다음과 같이 잘린 마지막 행을 저장하지 않으려면마이클 졸린메모:

./gcd-rand.py 10000 10000 | head -c 32M | sed '$d' > concievablyreallyhugefile

답변3

Python 코드는 영원히 반복됩니다. 따라서 백그라운드에서 실행했다가 파일 크기를 초과하면 종료하는 것이 좋습니다. 한 줄로:

{ ./gcd-rand.py 10000 10000 > f & }; p=$!; while (( $(stat -c %s f) < 33554432 )); do sleep .1; done; kill $p

참고: Dirk의 제안에 따라 적절한 수면 시간을 선택하세요. stat 외에도 du를 사용할 수도 있습니다.

답변4

ulimit다음을 사용하여 셸(또는 해당 하위 항목)이 생성할 수 있는 파일 크기를 제한 할 수 있습니다 .

ulimit -f 32768

관련 정보