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é ddnon 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
exprbyte, sostituendo ibs=e obs=. Se nessuna conversione diversa da sync, noerrored notruncè specificata, ciascun blocco di ingresso deve essere copiato nell'uscita come blocco singolo senza aggregare blocchi corti.
Quindi, vedete, quando ibse obssono definiti insieme come bspoi ibsha la precedenza - ma per il resto, se specifica, allora o obso cbsnon.
Ecco un esempio in cui ibsè più importante. Potresti fare qualcosa del genere se volessi monitorare quanto presto il /dev/randompool 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é ddsarà in grado di syncsincronizzare 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, ddscriverà 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 ddper 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 ddavrebbe 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 ddpuò 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 dddeve fare per renderlo tale.
E che 's come si può utilizzare ddper leggere in modo affidabile i tubi o altri tipi di file speciali - con solo un po' di matematica.
/dev/randombloccherà 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/urandomper un valore "casuale" meno casuale, o controllare il pool di entropia (in un ciclo e attendere, se necessario) ...