我刚刚遇到了以下 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.