Майте на увазі , що 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), найменш імовірно, вирішать, що файл буде записаний тоді, коли ще потрібно ще щось.