
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/null
es 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/null
hace es:
ejecute cat /dev/null
adjuntar su entrada estándar a dd
la salida estándar. El problema es que /dev/null
está vacío. También cat
lo que se le pide que haga: abrir un archivo vacío, escribir su contenido en la salida estándar y finalizar.
cat
canaliza 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/null
aparte 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, dd
funciona en Cygwin. Voy a decir que es un error.
Cuando hice una tee
para 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