web-dev-qa-db-ja.com

これらのコマンドの違いは何ですか-猫はddにパイプされ、猫だけですか?

Linuxでのこれら2つのコマンドの違いを知りたいです。

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

そして

$ cat ./boot.bin ./kernel.bin > devos.img
6
Daniel Smith

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 ...
_
14
ilkkachu