Extraña lista compuesta de comandos dd en bash

Extraña lista compuesta de comandos dd en bash

Acabo de encontrar la siguiente construcción bash, entiendo que esto se llama lista compuesta y que esos tres comandos cat se ejecutan en un entorno de subshell, lo que no entiendo es cómo encajan las tuberías allí y, en general, cómo funciona. Realmente agradecería una explicación paso a paso.

Es parte de un script de generación de imágenes binarias, así que ya sé lo que hace, lo que no entiendo es cómo llega allí:

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

¿Algún gurú de bash puede ayudarme?

Gracias

Respuesta1

Parece que está intentando concatenar los tres archivos en uno con relleno. El primer gato obtiene el archivo más /dev/zero, rellenado a 128 kilobytes. Lo mismo ocurre con el segundo, y el tercero simplemente se procesa directamente (también con /dev/zero). Luego, la tubería toma la salida de los tres y la guarda en un archivo de tamaño $SIZE. Esto crea un solo archivo con el archivo1 en un bloque de 128 kilobytes, luego el archivo2 en otro bloque de 128 kilobytes y luego el archivo3 llenando el resto con relleno.

Respuesta2

La catestafa del comandogatoCrea todos los archivos que se dan como argumentos.
Entonces:

cat $DIR/file1 /dev/zero

se concatena file1con cero(s) desde /dev/zerohasta que el siguiente comando esté dispuesto a leer. El siguiente comando (en la tubería |) es $DD count=128, lo que significa que 128 1k blocks(tenga en cuenta bs=1k en la definición de la variable) se leerá y escribirá en la salida estándar.

En resumen: léalo file1y rellénelo con ceros hasta 128k.

La siguiente línea de comando es bastante similar:

léalo file2y rellénelo con ceros hasta 128k.

Y la última línea simplemente dice file3(sin relleno).

Luego, todo ese flujo concatenado (entre paréntesis) se devuelve para ddescribir hasta $OUT_FILEkbytes $SIZE.

En breve:

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.

Entonces:

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

información relacionada