私は次の 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 に書き込まれることを意味します。
つまり、file1
128k まで読み取り、ゼロで埋めます。
次のコマンドラインも非常に似ています:
読み取り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.