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

Dan*_*ith 6 boot-loader pipe dd cat

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

$ cat ./boot.bin ./kernel.bin /dev/zero | dd bs=512 count=2880 of=devos.img
Run Code Online (Sandbox Code Playgroud)

$ cat ./boot.bin ./kernel.bin > devos.img
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 14

dd完全复制字节countbs,或者在这种情况下总共复制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
Run Code Online (Sandbox Code Playgroud)

实际上,dd如果在一次read()调用中获得的数据少于块大小,则读写会更少。这可能发生在大块大小的情况下,但可能不是 512 的问题,因为cat它将以至少该大小的块写入数据。在 GNU dd 中,这可以通过iflag=fullblock.

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

$ cat a b /dev/zero | head -c 16 ...
Run Code Online (Sandbox Code Playgroud)