Linuxでのこれら2つのコマンドの違いを知りたいです。
$ 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バイトを正確にコピーします。(ただし、以下を参照)。これにより、2つのファイルの連結が固定サイズに切り捨てられるかパディングされます(_/dev/zero
_は必要な数のゼロバイトを提供するため)。 1440 kBは3.5インチHDフロッピーディスクのサイズのように見えるので、フロッピーにぴったり合う画像を作成したいと思った人がいるかもしれません。
2番目の例のプレーンな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()
呼び出しでブロックサイズよりも少ないデータを取得すると、読み書きが少なくなります。これは大きなブロックサイズで発生する可能性がありますが、cat
は少なくともそのサイズのブロックにデータを書き込むため、512ではおそらく問題にはなりません。 GNU ddでは、これは_iflag=fullblock
_で防ぐことができます。
_head -c
_でも同じことができます。
_$ cat a b /dev/zero | head -c 16 ...
_