dd
ist konzipiert für das Blockieren - in der Regel das beste Werkzeug zur Verfügung , es zum Lesen von variabler Größe Eingaben ist , wenn Sie es getan müssen sofort da dd
nicht aktuelle Puffer liest in eine Zukunft write()
(wenn Sie sehr explizit mit größeren obs als ibs es so konfigurieren) , sondern write()
alles, was es liest, sobald es read()
ist (und optional verarbeitet) .
Hier sind einige wichtige Definitionen :
ibs=
expr
- Geben Sie die Größe des Eingabeblocks in Byte an (Standard ist 512) .
expr
obs=
expr
- Geben Sie die Ausgabeblockgröße in Byte an (Standard ist 512) .
expr
bs=
expr
- Stellen Sie sowohl die Eingabe- als auch die Ausgabeblockgröße auf
expr
Bytes ein und ersetzen Sie ibs=
und obs=
. Wenn keine andere Konvertierung als sync
, noerror
und notrunc
angegeben ist, wird jeder Eingabeblock als einzelner Block in die Ausgabe kopiert, ohne kurze Blöcke zu aggregieren.
Sie sehen also, wann ibs
und obs
wie bs
dann gemeinsam definiert werden, ibs
aber ansonsten, wenn Sie spezifisch sind, entweder obs
oder cbs
.
Hier ist ein Beispiel, das ibs
am wichtigsten ist. Sie könnten so etwas tun, wenn Sie nachverfolgen möchten, wie schnell sich der /dev/random
Pool gefüllt hat ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Solange if=
das Ziel überhaupt lesbar ist, führt dies immer zu einer Ausgabedatei mit derselben Größe, da dd
das sync
Einlesen von Blöcken auf Nullen verzögert wird. Mit anderen Worten, wenn dd
read()
s für einen Eingabeblock von $((size=10))
$((count=5))
Zeiten ist und die read()
Datei 2 Bytes zurückgibt, dann dd
schreiben 8 Bytes, dann 12 Bytes, dann 2 Bytes, dann 4 Bytes in ihre Outfile wie
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... weil dd
standardmäßig nicht verzögert. Wenn Sie also In-Streams verfolgen und die Schreibvorgänge eines anderen Prozesses eingrenzen müssen, dd
ist dies das richtige Werkzeug für Sie.
Wenn Sie nur eine gewisse Menge an Daten in eine reguläre Datei zu schreiben dann, im Gegensatz zu anderen Aussagen hier, können Sie auch dd
für diese - und ziemlich leicht - aber Sie brauchen mehr als einen und einen zuverlässigen Sperrfaktor .
Wenn Sie zum Beispiel Folgendes getan haben:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... würde der erste dd
so viele ibs="$size"
Eingabeblöcke puffern, wie nötig sind, um mindestens einen obs="${size}x$block_factor"
Ausgabeblock für jeden write()
zu der Pipe zwischen ihm und dem zweiten zu füllen dd
. Dies bedeutet, dass der zweite dd
die Ausgabe zuverlässig begrenzen kann, count="$lmt"
da alle write()
s des ersten Herstellers der E / A-Blockgröße entsprechen - unabhängig davon, wie viele read()
s der erste dafür dd
tun muss.
Auf diese Weise können Sie dd
Pipes oder andere Arten von Spezialdateien zuverlässig lesen - mit nur ein wenig Mathematik.
/dev/random
wird blockiert, wenn nicht genügend Entropie zur Verfügung steht, um die gewünschte Anzahl von Ziffern zu generieren. Es braucht einfach Zeit, um die Menge der zufälligen "Zufälligkeit" von Pseudoqualität zu erfassen ... Verwenden Sie entweder/dev/urandom
einen weniger zufälligen "Zufall" -Wert oder überprüfen Sie Ihren Entropiepool (in einer Schleife und warten Sie nach Bedarf) ...