ddjest przeznaczony do blokowania - jest to zwykle najlepsze narzędzie do Twojej dyspozycji do odczytu ze zmiennych danych wejściowych, jeśli potrzebujesz tego natychmiast, ponieważ ddnie buforuje bieżących odczytów w przyszłości write() (chyba że bardzo wyraźnie skonfigurujesz to w ten sposób z większym obsłem niż ibs) , ale zamiast write()wszystko to brzmi tak szybko, jak read()to wszystko (i ewentualnie przetwarza je) .
Oto kilka ważnych definicji :
ibs=expr
- Określ rozmiar bloku wejściowego, w bajtach, do (domyślnie 512) .
expr
obs=expr
- Określ rozmiar bloku wyjściowego, w bajtach, do (domyślnie 512) .
expr
bs=expr
- Ustaw rozmiar bloku wejściowego i wyjściowego na
exprbajty, zastępując ibs=i obs=. Jeśli konwersja nie inna niż sync, noerrori notruncjest określona, każdy blok wejściowy zostanie skopiowany na wyjście jako pojedynczy blok bez agregacji krótkie bloki.
Widzisz więc, kiedy ibsi obssą zdefiniowane razem, ponieważ bswtedy ibsma pierwszeństwo - ale w przeciwnym razie, jeśli jesteś konkretny, to albo obsalbo cbs.
Oto przykład, w którym ibsjest najważniejszy. Możesz zrobić coś takiego, jeśli chcesz śledzić, jak szybko /dev/randombasen się zapełni ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Dopóki if=„s celem jest czytelny w ogóle, że będzie zawsze prowadzić w tej samej wielkości pliku wynikowego, ponieważ ddbędzie synchronize bloki odczytu w na null. Innymi słowy, jeśli dd read()s dla wejściowego bloku $((size=10)) $((count=5))czasów, a read()plik zwraca 2 bajty, to 8 bajtów, następnie 12 bajtów, następnie 2 bajty, a następnie 4 bajty, ddzapisze w swoim pliku wyjściowym coś w rodzaju
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... ponieważ dddomyślnie nie opóźnia. Jeśli więc chcesz śledzić in-stream i ograniczyć zapisy innego procesu, ddto jest to narzędzie dla Ciebie.
Jeśli po prostu zapisujesz pewną ilość danych do zwykłego pliku, w przeciwieństwie do innych oświadczeń tutaj zawartych, możesz również użyć dddo tego - i dość łatwo - ale potrzebujesz więcej niż jednego i niezawodnego czynnika blokującego .
Na przykład, jeśli zrobiłeś:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... pierwszy ddbuforowałby tyle ibs="$size"bloków wejściowych, ile było niezbędnych do wypełnienia co najmniej jednego obs="${size}x$block_factor"bloku wyjściowego dla każdego write()potoku między nim a drugim dd. Oznacza to, że drugi ddmoże niezawodnie ograniczyć moc wyjściową, count="$lmt"ponieważ wszystkie write()pierwsze marki będą pasować do swojego rozmiaru bloku we / wy - niezależnie od tego, ile read()s ddmusi zrobić pierwszy .
W ten sposób możesz ddniezawodnie czytać potoki lub inne typy plików specjalnych - z odrobiną matematyki.
/dev/randomzablokuje się, jeśli nie będzie wystarczającej ilości entropii do wygenerowania żądanej liczby cyfr. po prostu potrzeba czasu, aby zebrać tyle wysokiej jakości losowej „losowości” psuedo ... Albo użyj/dev/urandommniej losowej „losowej” wartości, albo sprawdź pulę entropii (w pętli i poczekaj w razie potrzeby) ...