다음과 같은 프로그램/스크립트가 있다고 상상해 보세요 ./generate-infinite-byte-stream
.
#!/bin/bash
echo -n 'hello'
sleep infinity
무한 절전 명령은 내가 관심이 없는 무한한 미래에 더 많은 데이터를 제공할 수도 있고 제공하지 않을 수도 있는 네트워크 연결을 나타냅니다.
나는 프로그램을 갖고 싶습니다. stdout에서 5바이트를 출력할 때까지 take 5
실행된 ./generate-infinite-byte-stream
다음 종료하는 프로그램을 호출하겠습니다.
take 5 ./generate-infinite-byte-stream
# gives 'hello' and returns with exit code 0
그러한 프로그램이 있습니까? 아니면 popen()을 사용하여 직접 프로그램을 작성해야 합니까? 또한 프로그램은 take
stdin을 실행된 프로그램으로 리디렉션해야 합니다.
참고: head -c 5
종료되지 않기 때문에 올바른 작업을 수행하지 않습니다.
./generate-infinite-byte-stream | head -c 5
# this returns 'hello', but never terminates
따로: Take라는 이름은 다음에서 영감을 받았습니다.https://reference.wolfram.com/언어/ref/Take.html목록의 처음 n개 요소를 반환하는 명령입니다.
답변1
쉘이 Bash인 경우 프로세스 대체를 사용할 수 있습니다. 데모:
dd bs=1 count=5 < <(printf hello; sleep infinity)
생산자를 죽이지는 않지만 dd
명령이 완료되도록 연결을 끊습니다. 이것은 당신에게 필요할 수도 있고 아닐 수도 있습니다.