Lista composta estranha de comandos dd no bash

Lista composta estranha de comandos dd no bash

Acabei de encontrar a seguinte construção bash, entendo que isso é chamado de lista composta e que esses três comandos cat são executados em um ambiente subshell. O que não entendo é como os pipes se encaixam lá e, de maneira mais geral, como funciona. Eu realmente apreciaria uma explicação passo a passo.

Faz parte de um script de geração de imagem binária, então eu já sei o que ele faz, o que não entendo é como chega lá:

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

Algum guru do bash por aí pode me ajudar?

Obrigado

Responder1

Parece que ele está tentando concatenar todos os três arquivos em um com preenchimento. O primeiro cat obtém o arquivo mais /dev/zero, preenchido com 128 kilobytes. O mesmo acontece com o segundo, e o terceiro é apenas cat'ed diretamente (com /dev/zero também). Em seguida, o pipe pega a saída de todos os três e salva em um arquivo de tamanho $SIZE. Isso cria um único arquivo com arquivo1 em um bloco de 128 quilobytes, depois arquivo2 em outro bloco de 128 quilobytes e, em seguida, arquivo3 preenchendo o restante com preenchimento.

Responder2

O comando catcongatoenate todos os arquivos fornecidos como argumentos.
Então:

cat $DIR/file1 /dev/zero

concatena file1com zero(s) até /dev/zeroque o comando a seguir esteja disposto a ler. O próximo comando (no pipe |) é $DD count=128, o que significa que 128 1k blocks(observe bs=1k na definição da variável) será lido e gravado em stdout.

Resumindo: leia file1e preencha com zeros até 128k.

A próxima linha de comando é bastante semelhante:

leia file2e preencha com zeros até 128k.

E a última linha apenas lê file3(sem preenchimento).

Então, todo aquele fluxo concatenado (dentro dos parênteses) é devolvido para ddgravar $OUT_FILEaté $SIZEkbytes.

Resumidamente:

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.

Então:

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

informação relacionada