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 cat
estafa del comandogatoCrea todos los archivos que se dan como argumentos.
Entonces:
cat $DIR/file1 /dev/zero
se concatena file1
con cero(s) desde /dev/zero
hasta 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 file1
y rellénelo con ceros hasta 128k.
La siguiente línea de comando es bastante similar:
léalo file2
y 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 dd
escribir hasta $OUT_FILE
kbytes $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.