这些命令有什么区别 - cat 通过管道传输到 dd 和仅 cat?

这些命令有什么区别 - cat 通过管道传输到 dd 和仅 cat?

我很想知道 Linux 中这两个命令的区别:

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

$ cat ./boot.bin ./kernel.bin > devos.img

答案1

dd精确复制count字节块bs,或者在本例中总共 2880*512 字节(但见下文)。这会将两个文件的串联截断或填充到固定大小(因为/dev/zero提供了所需数量的零字节)。 1440 kB 看起来就像 3.5 英寸高清软盘的大小,所以也许有人想要制作完全适合软盘的图像。

第二个示例中的普通内容cat只会连接文件,结果将是任意大小。

较小的例子:

$ 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  \0  \0  \0  \0

实际上,dd如果一次调用获取的数据少于块大小,则读取和写入会减少read()。对于较大的块大小可能会发生这种情况,但对于 512 可能不是问题,因为cat会将数据写入至少该大小的块中。在 GNU dd 中,可以使用 来防止这种情况iflag=fullblock

我们可以做同样的事情head -c

$ cat a b /dev/zero | head -c 16 ...

相关内容