Qual é a diferença nestes comandos - cat piped to dd e apenas cat? [duplicado]

5

Estou curioso para saber a diferença entre esses dois comandos no Linux:

$ cat ./boot.bin ./kernel.bin /dev/zero | dd bs=512 count=2880 of=devos.img

e

$ cat ./boot.bin ./kernel.bin > devos.img
    
por Daniel Smith 05.07.2018 / 14:57

1 resposta

14

dd copia exatamente count blocos de bs bytes, ou 2880 * 512 bytes no total, neste caso (mas veja abaixo) . Isso truncará ou preencherá a concatenação dos dois arquivos para um tamanho fixo (pois /dev/zero fornece quantos bytes zero forem necessários). 1440 kB é parecido com o tamanho de um disquete de 3,5 "HD, então talvez alguém quisesse fazer imagens que encaixassem exatamente no disquete.

O cat em seu segundo exemplo apenas concatenará os arquivos, e o resultado será de qualquer tamanho.

Exemplo menor:

$ echo hello > a; echo world > b
$ cat a b | od -c
0000000   h   e   l   l   o  \n   w   o   r   l   d  \n
$ cat a b /dev/zero | dd bs=1 count=8 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   w   o
$ cat a b /dev/zero | dd bs=1 count=16 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   w   o   r   l   d  \n  
$ cat a b /dev/zero | head -c 16 ...
$ echo hello > a; echo world > b
$ cat a b | od -c
0000000   h   e   l   l   o  \n   w   o   r   l   d  \n
$ cat a b /dev/zero | dd bs=1 count=8 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   w   o
$ cat a b /dev/zero | dd bs=1 count=16 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   w   o   r   l   d  \n  
$ cat a b /dev/zero | head -c 16 ...
%pre% %pre% %pre%
%pre% %pre%

Na verdade, dd lerá e gravará menos se obtiver menos dados do que o tamanho de bloco em uma única chamada read() . Isso pode acontecer com grandes tamanhos de bloco, mas provavelmente não é um problema com 512, pois cat grava os dados em blocos de pelo menos esse tamanho. No GNU dd, isso pode ser evitado com iflag=fullblock .

Poderíamos fazer o mesmo com head -c :

%pre%     
por 05.07.2018 / 15:01