Não use dd
com pipes. dd
é de baixo nível. É uma interface para as chamadas do sistema read
e write
.
Quando você faz um dd bs=1024 count=1
, ele faz um read(0, buf, 1024)
.
Se read
retornar menos dados que 1024 bytes (por exemplo, porque o canal contém apenas 200 bytes no momento), dd
não tentará novamente o read
para obter os 824 bytes ausentes, ele informará um erro bloco incompleto lido no final (a parte depois de +
). A mesma coisa pode acontecer ao escrever também.
É por isso que é perigoso usar dd
em tubos, a menos que você possa garantir que os processos de gravação ou leitura no tubo o façam em proporções proporcionais ao tamanho do bloco e divisores para o tamanho do tubo. que você terá blocos completos.
(echo AAAA; sleep 1; echo BBBBBB) | dd bs=3 > /dev/null
3+2 records in
3+2 records out
Isso não é um problema muito grande aqui, pois estamos apenas escrevendo o que lemos, mas pode ser mais problemático quando, por exemplo, você especificar um count
.
O GNU dd
tem -iflag fullblock
para contornar isso:
$ (echo AAAA; sleep 1; echo BBBBBB) | dd bs=3 iflag=fullblock > /dev/null
4+0 records in
4+0 records out
12 bytes (12 B) copied, 1.00068 s, 0.0 kB/s