Por que dd termina instantaneamente ao canalizar para cat?

Por que dd termina instantaneamente ao canalizar para cat?

Eu começo o bash no Cygwin e digito:

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

Termina instantaneamente. Quando eu digito:

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

funciona conforme o esperado e posso emitir

killall -USR1 dd

para ver o progresso. Por que a invocação anterior termina instantaneamente? É o mesmo em uma caixa Linux?

*** Explicação por que fiz uma pergunta tão estúpida e possivelmente não tão estúpida

Eu estava compactando imagens do disco rígido e algumas foram compactadas incorretamente. Acabei com o seguinte script mostrando o problema:

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

Wc deveria escrever 1000000000 no final. O problema é que isso não acontece na minha máquina:

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

É um bug ou estou fazendo algo errado novamente?

Responder1

Não consigo pensar em nenhum motivo para fazer o que você está tentando fazer, mas acho que a maneira a seguir é a que você está procurando.

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

Responder2

AFAIK, seu primeiro comando não é funcional. Você está tentando canalizar a saída de /dev/zero para um comando que não recebe nenhuma entrada.

cat /dev/nullé apenas um comando que não produz nada. Canalizar qualquer coisa nele não fará absolutamente nada.

Quando você usa o redirecionamento stdout, a saída de /dev/zero é gravada no arquivo em questão (/dev/null, portanto, em lugar nenhum).

Responder3

O que dd if=/dev/zero | cat /dev/nullfaz é:

execute cat /dev/nullanexar é stdin para ddstdout. O problema é que isso /dev/nullestá vazio. O mesmo catacontece com o que é solicitado: abrir o arquivo vazio, gravar o conteúdo em stdout e finalizar.

catcanaliza a saída do stdin somente quando não há arquivos especificados. cat /dev/null -canalizará o conteúdo de /dev/null e stdin para stdout.

Como tal, dd if=/dev/zero | cat /dev/nullalém de desperdiçar, um processo não difere em nada de cat /dev/null.

Responder4

Eu tentei no Cygwin e no Ubuntu e obtive o resultado correto no Ubuntu. Se eu não enviar um sinal, ddele funcionará no Cygwin. Eu vou dizer que isso é um bug.

Quando fiz um teepara enviar a saída para um arquivo, ela consistia em zero bytes, mas havia muitos deles.

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

informação relacionada