Назад | Перейти на главную страницу

Почему 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

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

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

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

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

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

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

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

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

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

В качестве таких dd if=/dev/zero | cat /dev/null кроме расточительства процесс ничем не отличается от cat /dev/null.

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

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

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