Я только что наткнулся на следующую конструкцию 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
Команда cat
conкот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.