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

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

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

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 может мне помочь?

Спасибо

]
0
28.09.2016, 14:37
2 ответа

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

2
28.01.2020, 02:47

Команда cat con cat объединяет все файлы, указанные в качестве аргументов.
Итак:

cat $DIR/file1 /dev/zero

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

Вкратце: прочтите 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.
0
28.01.2020, 02:47

Теги

Похожие вопросы