Pipe
這些命令有什麼區別 - 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
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 ...