ddestá diseñado para bloquear: por lo general, es la mejor herramienta a su disposición para leer desde entradas de tamaño variable si lo necesita de inmediato, ya ddque no almacenará las lecturas de corriente en el futuro write() (a menos que lo configure de manera muy explícita de esa manera con un obs mayor que ibs) , pero, en cambio write(), leerá todo lo que lea tan pronto como read()sea (y opcionalmente lo procesará) .
Aquí hay algunas definiciones importantes :
ibs=expr
- Especifique el tamaño del bloque de entrada, en bytes, por (el valor predeterminado es 512) .
expr
obs=expr
- Especifique el tamaño del bloque de salida, en bytes, por (el valor predeterminado es 512) .
expr
bs=expr
- Establezca los tamaños de bloque de entrada y salida en
exprbytes, reemplazando ibs=y obs=. Si no se especifica otra conversión que sync, noerrory notruncse especifica, cada bloque de entrada se copiará a la salida como un bloque único sin agregar bloques cortos.
Así que ya ves, cuándo ibsy obsse definen juntos como bsentonces ibstiene prioridad, pero de lo contrario, si eres específico, entonces obso lo cbshace.
Aquí hay un ejemplo en el que ibses más importante. Puede hacer algo como esto si desea realizar un seguimiento de lo pronto que se /dev/randomllenó la piscina ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Mientras if='s objetivo se puede leer en absoluto, que será siempre como resultado el mismo tamaño de archivo de salida, porque ddse synchronize bloques de lectura en el nulos. En otras palabras, si dd read()s es para un bloque de entrada de $((size=10)) $((count=5))tiempos y el read()archivo devuelve 2 bytes, luego 8 bytes, luego 12 bytes, luego 2 bytes, luego 4 bytes, ddescribirán en su archivo de salida algo como
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... porque dd, por defecto, no se retrasa. Entonces, si necesita realizar un seguimiento in-stream y delimitar las escrituras de algún otro proceso, esta ddes la herramienta para usted.
Si solo está escribiendo cierta cantidad de datos en un archivo normal, a diferencia de otras declaraciones hechas aquí, también puede usarlo ddpara esto, y con bastante facilidad, pero necesitará más de uno y un factor de bloqueo confiable .
Por ejemplo, si hiciste:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... el primero ddalmacenará tantos ibs="$size"bloques de entrada como sean necesarios para llenar al menos un obs="${size}x$block_factor"bloque de salida por cada write()tubería entre él y el segundo dd. Esto significa que el segundo ddpuede limitar la salida de manera confiable count="$lmt"porque todos los write()s que realiza el primero coincidirán con su tamaño de bloque de E / S, independientemente de cuántos read()s dddebe hacer el primero para hacerlo.
Y así es como puede usar ddpara leer de manera confiable tuberías u otros tipos de archivos especiales, con solo un poco de matemática.
/dev/randomse bloqueará si no hay suficiente entropía disponible para generar la cantidad de dígitos que desea. simplemente toma tiempo reunir esa cantidad de "aleatoriedad" aleatoria de psuedo de alta calidad ... O use/dev/urandompara un valor "aleatorio" menos aleatorio, o verifique su grupo de entropía (en un bucle, y espere según sea necesario) ...