dd
è progettato per il blocco - di solito è lo strumento migliore a tua disposizione per leggere da input di dimensioni variabili se ne hai bisogno immediatamente fatto perché dd
non memorizzerà le letture correnti in futuro write()
(a meno che tu non lo configuri in modo molto esplicito con obs più grande di ibs) , ma sarà invece write()
tutto ciò che legge non appena lo read()
è (e facoltativamente lo elabora) .
Ecco alcune definizioni importanti :
ibs=
expr
- Specificare la dimensione del blocco di input, in byte, per (il valore predefinito è 512) .
expr
obs=
expr
- Specificare la dimensione del blocco di output, in byte, per (il valore predefinito è 512) .
expr
bs=
expr
- Impostare le dimensioni dei blocchi di input e output su
expr
byte, sostituendo ibs=
e obs=
. Se nessuna conversione diversa da sync
, noerror
ed notrunc
è specificata, ciascun blocco di ingresso deve essere copiato nell'uscita come blocco singolo senza aggregare blocchi corti.
Quindi, vedete, quando ibs
e obs
sono definiti insieme come bs
poi ibs
ha la precedenza - ma per il resto, se specifica, allora o obs
o cbs
non.
Ecco un esempio in cui ibs
è più importante. Potresti fare qualcosa del genere se volessi monitorare quanto presto il /dev/random
pool si è riempito ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Fintanto che if=
il target è leggibile, ciò comporterà sempre lo stesso file di output di dimensioni, perché dd
sarà in grado di sync
sincronizzare i blocchi letti su null. In altre parole, se dd
read()
s per un blocco di input di $((size=10))
$((count=5))
volte e il read()
file restituisce 2 byte, quindi 8 byte, quindi 12 byte, quindi 2 byte, quindi 4 byte, dd
scriverà sul suo file di output qualcosa come
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... perché dd
, per impostazione predefinita, non tarda. Quindi, se hai bisogno di tracciare in-stream e delimitare le scritture di qualche altro processo, dd
è lo strumento che fa per te.
Se stai solo scrivendo una certa quantità di dati in un file normale, contrariamente ad altre dichiarazioni qui, puoi anche usarlo dd
per questo - e abbastanza facilmente - ma avrai bisogno di più di un fattore di blocco affidabile .
Ad esempio, se hai fatto:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... il primo dd
avrebbe bufferizzato tutti i ibs="$size"
blocchi di input necessari per riempire almeno un obs="${size}x$block_factor"
blocco di output per ciascuno write()
nel tubo tra esso e il secondo dd
. Ciò significa che il secondo dd
può limitare in modo affidabile l'output count="$lmt"
perché tutte le write()
s che la prima produce corrisponderanno al suo blocco di I / O - indipendentemente da quanti read()
s la prima dd
deve fare per renderlo tale.
E che 's come si può utilizzare dd
per leggere in modo affidabile i tubi o altri tipi di file speciali - con solo un po' di matematica.
/dev/random
bloccherà se non c'è abbastanza entropia disponibile per generare il numero di cifre che desideri. ci vuole semplicemente tempo per raccogliere quella quantità di "casualità" casuale psuedo di alta qualità ... O utilizzare/dev/urandom
per un valore "casuale" meno casuale, o controllare il pool di entropia (in un ciclo e attendere, se necessario) ...