¿Por qué dd finaliza instantáneamente cuando se canaliza a cat?

¿Por qué dd finaliza instantáneamente cuando se canaliza a cat?

Empiezo bash en Cygwin y escribo:

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

Termina instantáneamente. Cuando escribo:

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

funciona como se esperaba y puedo emitir

killall -USR1 dd

para ver el progreso. ¿Por qué la invocación anterior finaliza instantáneamente? ¿Es lo mismo en una máquina Linux?

*** Explicación de por qué hice una pregunta tan estúpida y posiblemente no tan estúpida.

Estaba comprimiendo imágenes del disco duro y algunas estaban comprimidas incorrectamente. Terminé con el siguiente script que muestra el 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 debería escribir 1000000000 al final. El problema es que en mi máquina no funciona:

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

¿Es un error o estoy haciendo algo mal una vez más?

Respuesta1

No se me ocurre ninguna razón para hacer lo que estás intentando hacer, pero supongo que la siguiente forma es la que estás buscando.

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

Respuesta2

AFAIK, tu primer comando no funciona. Está intentando canalizar la salida de /dev/zero a un comando que no recibe ninguna entrada.

cat /dev/nulles solo un comando que no genera nada. Por lo tanto, canalizar algo en él no hará nada en absoluto.

Cuando utiliza la redirección stdout, la salida de /dev/zero se escribe en el archivo en cuestión (/dev/null, por lo tanto, en ninguna parte).

Respuesta3

Lo que dd if=/dev/zero | cat /dev/nullhace es:

ejecute cat /dev/nulladjuntar su entrada estándar a ddla salida estándar. El problema es que /dev/nullestá vacío. También catlo que se le pide que haga: abrir un archivo vacío, escribir su contenido en la salida estándar y finalizar.

catcanaliza la salida desde la entrada estándar solo cuando no hay archivos especificados. cat /dev/null -canalizará el contenido de /dev/null y stdin a stdout.

Como tal, dd if=/dev/zero | cat /dev/nullaparte de desperdiciar un proceso, no se diferencia en nada de cat /dev/null.

Respuesta4

Lo probé en Cygwin y Ubuntu y obtuve el resultado correcto en Ubuntu. Si no le envío una señal, ddfunciona en Cygwin. Voy a decir que es un error.

Cuando hice una teepara enviar la salida a un archivo, constaba de cero bytes, pero había demasiados.

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

información relacionada