Этот вопрос звучит так: «У меня есть один инструмент, который может рисовать прямоугольники, а другой - ромбы; какой инструмент является правильным для рисования квадрата?"
Любой квадрат - это особый случай прямоугольника и особый случай ромба, поэтому можно использовать любой из двух инструментов.
То же самое с dd
и cat
. Первый может конвертировать, пропускать и искать, корректировать размер буфера; но в простом случае он просто читает один файл (или блочное устройство) и записывает необработанные данные в другой. Последний может объединять несколько файлов в один поток с некоторыми необязательными текстовыми изменениями, но в простом случае есть только один входной файл, содержимое которого передается (с поддержкой оболочки) в выходной файл или устройство.
Оба инструмента полезны, и ни один из них не может быть отброшен в пользу другого. Их возможности просто перекрываются в этом простом случае, о котором вы спрашиваете.
Сказав это, я думаю, что есть по крайней мере две проблемы, которые делают dd
лучшим выбором.
1. Блокировать права доступа к устройству
Для записи в файл или на устройство cat
необходимо перенаправить вывод. Ваша оболочка выполняет перенаправление, т.е. открывает целевой файл. При перенаправлении в /dev/sdb
вы, вероятно, нажмете "Отказано в доступе", если вы не вошли в систему как root. Запускать оболочку от имени пользователя root рискованно, и его следует избегать.
Вы можете попробовать
sudo cat myimage.img > /dev/sdb
и потерпеть неудачу, потому что sudo
не влияет на перенаправление вывода, выполняемое оболочкой.
С другой стороны, это совершенно не проблема:
sudo dd if=myimage.img of=/dev/sdb
Кстати, небольшой совет: если вы оказались в ситуации, когда вам нужно перенаправить вывод в файл с ограниченным доступом, вы можете использовать этот трюк:
some_command | sudo tee restricted_file > /dev/null
Это приводит нас к еще одному способу выполнения работы. Команда tee
передает свой ввод нескольким файлам и стандартному выводу. В простом случае есть один файл и стандартный вывод отбрасывается:
sudo tee /dev/sdb < myimage.img > /dev/null
В этом случае также существует перенаправление ввода, на которое не влияет sudo
.
2. Выходя за рамки простого случая
Представьте себе плотника, который делает кухонные столы. Большинство столов имеют прямоугольные верхние поверхности; ромбовидные из них встречаются гораздо реже. Есть стол с квадратной столешницей. Квадрат - это ромб, а также прямоугольник. Плотник будет использовать методы, которые применяются к редким столам в форме ромба? или к обычным прямоугольным столам? Оба набора методов должны работать с квадратной таблицей, тем не менее он создает прямоугольники каждый рабочий день, поэтому нет смысла менять подход.
Вернуться к cat
и dd
. По моему мнению (и моей практике) вряд ли когда-либо будет необходимо объединять несколько изображений, чтобы записать их все для блокировки устройства. Это определенно было бы работой для cat
. Инструмент может сделать что-то большее, но вы этого не хотите: параметры предназначены для текстовых файлов, поэтому они могут сделать недействительными ваши двоичные данные при использовании с файлом изображения.
Теперь опции, предоставляемые dd
, часто полезны для меня, когда я читаю или пишу на устройство:
conv=noerr
- когда источник может быть неисправен;
bs=…
- большой буфер не исчерпает мой жесткий диск;
count=…
- прочитать фрагмент, например MBR;
conv=sparse
- для уменьшения размера изображения при некоторых обстоятельствах.
Есть еще кое-что. Эта команда:
kill -s USR1 $(pidof dd)
заставляет dd
выводить статистику ввода / вывода на стандартную ошибку. Я не думаю, что вы можете сделать это с cat
.
По этим причинам я считаю dd
естественным инструментом для работы с необработанными изображениями. Я не вижу смысла менять инструмент на cat
только потому, что в каком-то особом случае нет никакой разницы. Я хотел бы думать, что инструкции обычно используют dd
потому что их авторы думают как я. Существует некоторая элегантность в способности сознательно выбирать правильный инструмент, особенно когда есть и другие, которые кажутся одинаково подходящими.
В конце я признаю, что использовал pv myimage.img | sudo tee /dev/sdb > /dev/null
. Я отказался от своего правильного инструмента, но pv
дал мне индикатор выполнения. Если вам не нужно объединить (или разбить ваши двоичные данные с помощью текстового инструмента), cat
ничего не даст.