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 cat
conKatzeaktiviert alle Dateien, die als Argumente angegeben sind.
Also:
cat $DIR/file1 /dev/zero
file1
wird 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 file1
und mit Nullen bis 128 KB auffüllen.
Die nächste Befehlszeile ist ziemlich ähnlich:
lesen file2
und mit Nullen bis 128 KB auffüllen.
Und die letzte Zeile lautet einfach „das“ file3
(ohne Polsterung).
dd
Anschließend wird der gesamte (in Klammern) verknüpfte Datenstrom zum Schreiben ( $OUT_FILE
bis 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.