Почему dd мгновенно завершает работу при конвейеризации в cat?

Почему dd мгновенно завершает работу при конвейеризации в cat?

Я запускаю bash на Cygwin и набираю:

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

Он заканчивается мгновенно. Когда я печатаю:

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

он работает как и ожидалось и я могу выдать

killall -USR1 dd

чтобы увидеть прогресс. Почему предыдущий вызов завершается мгновенно? То же самое на Linux-боксе?

*** Объяснение, почему я задал такой глупый вопрос, а может и не такой уж глупый вопрос

Я сжимал образы hdd, и некоторые из них были сжаты неправильно. В итоге я получил следующий скрипт, показывающий проблему:

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

Wc должен написать в конце 1000000000. Проблема в том, что на моей машине этого не происходит:

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

Это баг или я снова что-то делаю не так?

решение1

Я не могу придумать ни одной причины, по которой стоит делать то, что вы пытаетесь сделать, но, полагаю, следующий способ — это то, что вы ищете.

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

решение2

AFAIK, ваша первая команда не функциональна. Вы пытаетесь передать вывод /dev/zero в команду, которая не принимает входных данных.

cat /dev/nullэто просто команда, которая ничего не выводит. Поэтому передача в нее чего-либо ничего не даст вообще.

При использовании перенаправления stdout вывод /dev/zero записывается в нужный файл (а следовательно, /dev/null — в никуда).

решение3

Что dd if=/dev/zero | cat /dev/nullделает:

запустить cat /dev/nullприкрепить его stdin к ddstdout. Проблема в том, что он /dev/nullпуст. То же самое и catс тем, что просят сделать: открыть пустой файл, записать его содержимое в stdout и завершить.

catнаправляет вывод из stdin только в том случае, если не указаны файлы. cat /dev/null -перенаправляет содержимое /dev/null и stdin в stdout.

Таким образом, dd if=/dev/zero | cat /dev/nullкроме пустой траты времени, процесс ничем не отличается от cat /dev/null.

решение4

Я пробовал это на Cygwin и Ubuntu и получил правильный результат в Ubuntu. Если я не посылаю сигнал, ddэто работает на Cygwin. Я скажу, что это ошибка.

Когда я выполнил команду a teeдля отправки вывода в файл, он состоял из одних нулевых байтов, но их было слишком много.

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

Связанный контент