Por que o dd termina instantaneamente quando pipelining to cat?

1

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 como esperado e eu 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 porque eu fiz uma pergunta tão estúpida e possivelmente não uma pergunta 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 deve 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 erro ou estou fazendo algo errado mais uma vez?

    
por agsamek 23.12.2010 / 10:43

4 respostas

3

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

 dd if=/dev/zero | cat > /dev/null
    
por 23.12.2010 / 10:56
4

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

cat /dev/null é apenas um comando que não gera nada. Piping qualquer coisa alguma coisa, portanto, não fará nada.

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

    
por 23.12.2010 / 10:52
2

O que o dd if=/dev/zero | cat /dev/null faz é:

execute cat /dev/null anexando seu stdin a dd stdout. O problema é que /dev/null está vazio. Então cat faz o que é pedido para fazer: Abra o arquivo vazio e grave seu conteúdo para stdout e termine.

cat só envia saída de stdin 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/null , além de perder um processo, não difere em nada de cat /dev/null .

    
por 23.12.2010 / 14:20
1

Eu tentei no Cygwin e no Ubuntu e obtive o resultado correto no Ubuntu. Se eu não enviar um sinal para dd , ele funciona no Cygwin. Eu vou dizer que é um bug.

Quando eu fiz um tee para enviar a saída para um arquivo, ele consistia em todos os bytes zero, mas havia muitos deles.

dd if=/dev/zero bs=5000000 count=200 | gzip -c | gzip -cd |  tee dd.out | wc -c
    
por 23.12.2010 / 16:43