
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/null
faz é:
execute cat /dev/null
anexar é stdin para dd
stdout. O problema é que isso /dev/null
está vazio. O mesmo cat
acontece com o que é solicitado: abrir o arquivo vazio, gravar o conteúdo em stdout e finalizar.
cat
canaliza 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/null
alé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, dd
ele funcionará no Cygwin. Eu vou dizer que isso é um bug.
Quando fiz um tee
para 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