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 cat
congatoenate todos os arquivos fornecidos como argumentos.
Então:
cat $DIR/file1 /dev/zero
concatena file1
com zero(s) até /dev/zero
que 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 file1
e preencha com zeros até 128k.
A próxima linha de comando é bastante semelhante:
leia file2
e 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 dd
gravar $OUT_FILE
até $SIZE
kbytes.
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.