dd
está 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 dd
que 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
expr
bytes, reemplazando ibs=
y obs=
. Si no se especifica otra conversión que sync
, noerror
y notrunc
se especifica, cada bloque de entrada se copiará a la salida como un bloque único sin agregar bloques cortos.
Así que ya ves, cuándo ibs
y obs
se definen juntos como bs
entonces ibs
tiene prioridad, pero de lo contrario, si eres específico, entonces obs
o lo cbs
hace.
Aquí hay un ejemplo en el que ibs
es más importante. Puede hacer algo como esto si desea realizar un seguimiento de lo pronto que se /dev/random
llenó 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 dd
se sync
hronize 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, dd
escribirá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 dd
es 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 dd
para 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 dd
almacenará 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 dd
puede 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 dd
debe hacer el primero para hacerlo.
Y así es como puede usar dd
para leer de manera confiable tuberías u otros tipos de archivos especiales, con solo un poco de matemática.
/dev/random
se 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/urandom
para un valor "aleatorio" menos aleatorio, o verifique su grupo de entropía (en un bucle, y espere según sea necesario) ...