Pipe

這些命令有什麼區別 - cat 通過管道傳輸到 dd 而只是 cat?

  • July 5, 2018

我很想知道Linux中這兩個命令之間的區別:

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

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

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 ...

引用自:https://unix.stackexchange.com/questions/453620