Como você parece basicamente entender, a primeira versão lê 1024 bytes,
e depois escreve quantos bytes retornaram da leitura,
enquanto a segunda versão faz 1024 leituras e gravações de um byte cada.
Ao copiar arquivos comuns, o tamanho de bloco maior (resultando no menor número de E / Ss)
pode ser marginalmente mais eficiente. Isso provavelmente vale para /dev/urandom
também.
Mas você precisa ter cuidado ao usar dd
em arquivos especiais (ou seja, dispositivos).
Por exemplo,
dd if=(whatever input) of=(a magnetic tape device) bs=1024 count=1
irá escrever um bloco de fita de 1024 bytes;
dd … bs=1 count=1024
escreverá 1024 blocos de um byte cada.
Estes não são os mesmos;
os 1024 blocos pequenos ocuparão mais espaço na fita do que o bloco grande,
devido a intervalos entre registros e pode causar problemas para a leitura da fita.
Mais relevante para sua pergunta, se você ler ( if=
) de /dev/random
,
ele retornará apenas quantos bytes de alta entropia estiverem disponíveis.
Então, na primeira versão, você pode ter menos de 1024 bytes.
Mas, se você tentar ler um byte e o pool de entropia estiver vazio, a leitura será bloqueada (ou seja, espere)
até que os dados estejam disponíveis, então a segunda versão teria a garantia de obter 1024 bytes
(embora possa demorar um tempo arbitrariamente longo).
Para ampliar o ponto sobre a unidade de fita:
dd if=(appropriate input) of=(a magnetic tape device) bs=512 count=2
irá escrever dois blocos de fita de 512 bytes. Um subseqüente
dd if=(magnetic tape device) of=(whatever) bs=1024 count=1
pode ler apenas o primeiro bloco; ou seja, os primeiros 512 bytes.
E os pipes (nomeados) podem apresentar o mesmo problema que /dev/random
- uma leitura grande retornará apenas como bytes conforme a disponibilidade;
Então, novamente, na primeira versão, você pode obter menos de 1024 bytes.
Mas, se você tentar ler um byte de cada vez, a leitura esperará até que os dados estejam disponíveis, então a segunda versão teria a garantia de obter 1024 bytes (ou pelo menos ler até EOF).