Seu comando dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1 cria um arquivo de dois bytes em vez de um de 10 bytes devido à interação mal definida entre bs e obs . (Chame isso de um bug do programa, se quiser, mas provavelmente é melhor definido como um bug de documentação.) Você deve usar bs ou ibs e obs .
Empiricamente, parece que bs substitui obs , então o que é executado é dd if=/dev/zero of=./foo count=1 bs=1 seek=1 , que cria um arquivo de dois bytes como você viu.
Se você tivesse usado dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1 , teria um arquivo de 10 bytes como esperado.
Como alternativa, se você deseja criar um arquivo vazio que não ocupa nenhum espaço de dados no disco, pode usar o comando% intuitivo truncate :
truncate --size=10 foo