Seltsame zusammengesetzte Liste von dd-Befehlen in Bash

Seltsame zusammengesetzte Liste von dd-Befehlen in Bash

Ich bin gerade auf die folgende Bash-Konstruktion gestoßen. Ich verstehe, dass sie Compound-List heißt und dass diese drei Cat-Befehle in einer Subshell-Umgebung ausgeführt werden. Was ich nicht verstehe, ist, wie die Pipes dort hineinpassen und allgemeiner, wie es funktioniert. Ich wäre wirklich dankbar für eine schrittweise Erklärung.

Es ist Teil eines Skripts zur Generierung binärer Bilder, daher weiß ich ungefähr schon, was es macht. Was ich nicht verstehe, ist, wie es dorthin gelangt:

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

Kann mir irgendein Bash-Guru da draußen helfen?

Danke

Antwort1

Es sieht so aus, als würde versucht, alle drei Dateien mit Füllzeichen zu einer zusammenzufügen. Der erste Cat erhält die Datei plus /dev/zero, aufgefüllt auf 128 Kilobyte. Dasselbe gilt für den zweiten, und der dritte wird direkt mit Cat verknüpft (ebenfalls mit /dev/zero). Dann nimmt die Pipe die Ausgabe aller drei und speichert sie in einer Datei der Größe $SIZE. Dadurch wird eine einzelne Datei mit Datei1 in einem 128-Kilobyte-Block erstellt, dann Datei2 in einem weiteren 128-Kilobyte-Block, dann füllt Datei3 den Rest mit Füllzeichen auf.

Antwort2

Der Befehl catconKatzeaktiviert alle Dateien, die als Argumente angegeben sind.
Also:

cat $DIR/file1 /dev/zero

file1wird mit Nullen verkettet /dev/zero, bis der folgende Befehl lesen möchte. Der nächste Befehl (in der Pipe |) ist $DD count=128, was bedeutet, dass 128 1k blocks(beachten Sie bs=1k in der Definition der Variablen) gelesen und in stdout geschrieben werden.

Kurz gesagt: Lesen file1und mit Nullen bis 128 KB auffüllen.

Die nächste Befehlszeile ist ziemlich ähnlich:

lesen file2und mit Nullen bis 128 KB auffüllen.

Und die letzte Zeile lautet einfach „das“ file3(ohne Polsterung).

ddAnschließend wird der gesamte (in Klammern) verknüpfte Datenstrom zum Schreiben ( $OUT_FILEbis zu KBytes ) zurückgegeben $SIZE.

Zusamenfassend:

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.

Dann:

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

verwandte Informationen