
Я запускаю 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 к dd
stdout. Проблема в том, что он /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