Il tuo comando dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1
crea un file a due byte anziché un file a 10 byte a causa dell'interazione scarsamente definita tra bs
e obs
. (Chiamalo un bug del programma, se vuoi, ma probabilmente è meglio definito come un bug della documentazione.) Dovresti usare uno bs
o ibs
e obs
.
Empiricamente sembra che bs
sovrascrive obs
, quindi ciò che viene eseguito è dd if=/dev/zero of=./foo count=1 bs=1 seek=1
, che crea un file a due byte come hai visto.
Se avessi usato dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1
avresti ottenuto un file di 10 byte come previsto.
In alternativa, se desideri creare un file vuoto che non occupi spazio dati su disco, puoi utilizzare il nome non intuitivo truncate
comando:
truncate --size=10 foo
La manpage POSIX indica:
ibs=espr
Specifica la dimensione del blocco di input, in byte, tramite expr (il valore predefinito è 512).
obs=expr
Specifica la dimensione del blocco di output, in byte, tramite expr (il valore predefinito è 512).
bs=expr
Imposta sia input che output dimensioni del blocco in expr byte, supersedingibs=e obs= . Se non viene specificata alcuna conversione diversa da sync, noerror e nottrunc, ogni blocco di input deve essere copiato nell'output come un singolo blocco senza aggregare blocchi brevi.
dd
di Linux funziona allo stesso modo. Pertanto, usa ibs
invece:
dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1