cat으로 파이프라인할 때 dd가 즉시 종료되는 이유는 무엇입니까?

cat으로 파이프라인할 때 dd가 즉시 종료되는 이유는 무엇입니까?

Cygwin에서 bash를 시작하고 다음을 입력합니다.

dd if=/dev/zero | cat /dev/null

즉시 완료됩니다. 내가 입력할 때:

dd if=/dev/zero > /dev/null

예상대로 실행되고 발행할 수 있습니다

killall -USR1 dd

진행 상황을 보려면. 이전 호출이 즉시 종료되는 이유는 무엇입니까? Linux 상자에서도 동일합니까?

*** 내가 왜 그렇게 멍청한 질문을 했는지 설명하고 어쩌면 그다지 멍청하지 않은 질문을 했을 수도 있습니다.

HDD 이미지를 압축하고 있었는데 일부가 잘못 압축되었습니다. 문제를 보여주는 다음 스크립트로 끝났습니다.

while sleep 1 ; do killall -v -USR1 dd ; done &
dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd |  wc -c

Wc는 끝에 1000000000을 써야 합니다. 문제는 내 컴퓨터에는 없다는 것입니다.

bash-3.2$ dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd |  wc -c
13+0 records in
12+0 records out
60000000 bytes (60 MB) copied, 0.834 s, 71.9 MB/s
27+0 records in
26+0 records out
130000000 bytes (130 MB) copied, 1.822 s, 71.4 MB/s
200+0 records in
200+0 records out
1000000000 bytes (1.0 GB) copied, 13.231 s, 75.6 MB/s
1005856128

버그인가요 아니면 제가 또 뭔가 잘못하고 있는 걸까요?

답변1

나는 당신이하려는 일을 할 이유가 없다고 생각할 수 있지만 다음 방법이 당신이 찾고있는 방법이라고 생각합니다.

 dd if=/dev/zero | cat > /dev/null

답변2

AFAIK, 첫 번째 명령은 작동하지 않습니다. /dev/zero의 출력을 입력을 받지 않는 명령으로 파이프하려고 합니다.

cat /dev/null아무것도 출력하지 않는 명령일 뿐입니다. 따라서 그 안에 무엇이든 파이핑하면 아무 일도 일어나지 않습니다.

stdout 리디렉션을 사용하면 /dev/zero의 출력이 문제의 파일에 기록됩니다(/dev/null 따라서 어디에도 없음).

답변3

무엇을 dd if=/dev/zero | cat /dev/null하는가:

실행하여 cat /dev/nullstdin을 ddstdout에 연결하십시오. 문제는 그것이 /dev/null비어 있다는 것입니다. cat요청된 작업도 마찬가지 입니다. 빈 파일을 열고 내용을 stdout에 쓰고 완료합니다.

cat지정된 파일이 없는 경우에만 stdin에서 출력을 파이프합니다. cat /dev/null -/dev/null 및 stdin의 내용을 stdout으로 파이프합니다.

따라서 dd if=/dev/zero | cat /dev/null프로세스를 낭비하는 것 외에는 cat /dev/null.

답변4

Cygwin과 Ubuntu에서 시도해 보았고 Ubuntu에서 올바른 결과를 얻었습니다. 신호를 보내지 않으면 ddCygwin에서 작동합니다. 나는 그것이 버그라고 말할 것입니다.

출력을 파일로 보내기 위해 a를 수행했을 때 tee모두 0바이트로 구성되어 있었지만 너무 많았습니다.

dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd |  tee dd.out | wc -c

관련 정보