Имейте в виду , что ddявляется низкоуровневым интерфейсом к read(), write()и lseek()системный вызов. Вы можете надежно использовать его только для извлечения фрагментов данных из обычных файлов, блочных устройств и некоторых символьных устройств (например /dev/urandom), то есть файлов, для которых read(buf, size)гарантированно будет возвращаться, sizeпока не достигнут конец файла.
Для каналов, сокетов и большинства символьных устройств (таких как ttys) у вас нет такой гарантии, если вы не read()используете размер 1 или не используете ddрасширение GNU iflag=fullblock.
Так что либо:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
Или:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
Или с оболочками со встроенной поддержкой оператора поиска, например ksh93:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
Или zsh(если вы headподдерживаете -cопцию здесь):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
oflag=append conv=notrunc), поэтому файловые системы, которые выполняют отложенное размещение (например, XFS), с наименьшей вероятностью решат, что файл готов к записи, когда еще многое предстоит сделать.