Я запускаю 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