bash 中奇怪的 dd 命令复合列表

bash 中奇怪的 dd 命令复合列表

我刚刚遇到了以下 bash 构造,我知道这称为复合列表,并且这三个 cat 命令是在子 shell 环境中执行的,我不明白的是管道如何安装在那里,更一般地说,它是如何工作的。我真的很感激一步一步的解释。

它是二进制图像生成脚本的一部分,所以我已经知道它的作用,但我不知道它是如何到达那里的:

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

看起来它正在尝试使用填充将所有三个文件连接成一个。第一只猫获取文件加上 /dev/zero,填充到 128 KB。与第二个相同,第三个直接被 cat'ed(也与 /dev/zero 一起)。然后管道获取所有三个的输出并保存到大小为 $SIZE 的文件中。这将创建一个文件,其中 file1 在 128 KB 块中,然后 file2 在另一个 128 KB 块中,然后 file3 用填充填充其余部分。

答案2

命令cat控制生成作为参数给出的所有文件。
所以:

cat $DIR/file1 /dev/zero

从开始到以下命令愿意读取file1为止与零连接。/dev/zero下一个命令(在管道中|)是$DD count=128,这意味着 128 1k blocks(注意变量定义中的 bs=1k)将被读取并写入到 stdout。

简而言之:读取file1并用零填充最多 128k。

下一个命令行非常相似:

读取file2并用零填充最多 128k。

最后一行只读取file3(没有填充)。

然后,所有(括号内)连接的流都被返回以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.

相关内容