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