Странный составной список команд dd в bash

Странный составной список команд dd в bash

Я только что наткнулся на следующую конструкцию bash, я понимаю, что это называется composite-list и что эти три команды cat выполняются в среде subshell, но я не понимаю, как там вписываются каналы и, в целом, как это работает. Я был бы очень признателен за пошаговое объяснение.

Это часть скрипта генерации двоичного изображения, поэтому я уже знаю, что он делает, но я не понимаю, как он туда попадает:

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

Похоже, он пытается объединить все три файла в один с заполнением. Первый cat получает файл плюс /dev/zero, дополненный до 128 килобайт. То же самое со вторым, а третий просто напрямую cat'ится (также с /dev/zero). Затем конвейер берет вывод всех трех и сохраняет в файл размером $SIZE. Это создает один файл с file1 в блоке 128 килобайт, затем file2 в другом блоке 128 килобайт, затем file3 заполняет остаток заполнением.

решение2

Команда catconкотenates все файлы, которые указаны в качестве аргументов.
Итак:

cat $DIR/file1 /dev/zero

объединяется file1с нулями, /dev/zeroпока следующая команда не будет готова к чтению. Следующая команда (в конвейере |) — $DD count=128, что означает, что 128 1k blocks(обратите внимание на bs=1k в определении переменной) будет прочитано и записано в stdout.

Короче говоря: прочитайте file1и дополните его нулями до 128К.

Следующая командная строка очень похожа:

прочитайте file2и дополните его нулями до 128К.

А последняя строка просто читается 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.

Связанный контент