Su comando dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1
crea un archivo de dos bytes en lugar de un archivo de 10 bytes debido a una interacción mal definida entre bs
y obs
. (Llame a esto un error de programa si lo desea, pero probablemente esté mejor definido como un error de documentación). Se supone que debe usar cualquiera bs
o ibs
y obs
.
Empíricamente parece que bs
anula obs
, entonces lo que se ejecuta es dd if=/dev/zero of=./foo count=1 bs=1 seek=1
, que crea un archivo de dos bytes como has visto.
Si hubiera usado dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1
habría obtenido un archivo de 10 bytes como se esperaba.
Como alternativa, si desea crear un archivo vacío que no ocupe ningún espacio de datos en el disco, puede usar el nombre contrario a la intuición truncate
comando:
truncate --size=10 foo
La página de manual de POSIX dice:
ibs=expr
Especifique el tamaño del bloque de entrada, en bytes, por expr (el valor predeterminado es 512).
obs=expr
Especifique el tamaño del bloque de salida, en bytes, por expr (el valor predeterminado es 512).
bs=expr
Establecer tanto entrada como salida tamaños de bloque a expr bytes, reemplazandoibs=y obs= . Si no se especifica ninguna otra conversión que no sea sync, noerror y notrunc, cada bloque de entrada se copiará en la salida como un solo bloque sin agregar bloques cortos.
dd
de Linux funciona de la misma manera. Por lo tanto, use ibs
en cambio:
dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1