bash の dd コマンドの奇妙な複合リスト

bash の dd コマンドの奇妙な複合リスト

私は次の bash 構造に遭遇しました。これは複合リストと呼ばれ、これら 3 つの cat コマンドはサブシェル環境で実行されることは理解していますが、パイプがそこにどのように適合するか、そしてより一般的には、それがどのように機能するかがわかりません。ステップごとの説明をいただければ幸いです。

これはバイナリ イメージ生成スクリプトの一部なので、何をするのかは既にわかっていますが、それがどのように実行されるのかはわかりません。

export DD="dd status=noxfer bs=1k iflag=fullblock"
(
    cat $DIR/file1 /dev/zero | $DD count=128
    cat $DIR/file2 /dev/zero | $DD count=128
    cat $DIR/file3 /dev/zero
) | $DD of=$OUT_FILE count=$SIZE

どこかの Bash の達人が私を助けてくれませんか?

ありがとう

答え1

3 つのファイルすべてをパディング付きで 1 つに連結しようとしているようです。最初の cat は、ファイルと /dev/zero を取得し、128 キロバイトにパディングします。2 番目も同じで、3 番目は直接 cat されます (/dev/zero も使用)。次に、パイプは 3 つすべての出力を取得し、サイズが $SIZE のファイルに保存します。これにより、file1 が 128 キロバイトのブロックに、file2 が別の 128 キロバイトのブロックに、file3 が残りをパディングで埋めた単一のファイルが作成されます。

答え2

コマンドcatコン引数として指定されたすべてのファイルをenateします。
つまり、

cat $DIR/file1 /dev/zero

file1次のコマンドが読み取るまで、 から までをゼロで連結します/dev/zero。次のコマンド (パイプ内|) は で$DD count=128、これは 128 1k blocks(変数の定義では bs=1k であることに注意してください) が読み取られ、stdout に書き込まれることを意味します。

つまり、file1128k まで読み取り、ゼロで埋めます。

次のコマンドラインも非常に似ています:

読み取りfile2、128k までゼロを埋め込みます。

そして最後の行にはfile3(パディングなし)とだけ書かれています。

次に、その(括弧内の)連結されたストリームすべてが、最大 KB までdd書き込むために返されます。$OUT_FILE$SIZE

要するに:

read all from file1 and pad with zeros up to 128k.
read all from file2 and pad with zeros up to 128k.
read all from file3.

それから:

Write all that was read to `$OUT_FILE` up to `$SIZE` kBytes.

関連情報