我很想知道 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 ...