dd
được thiết kế để chặn - nó thường là công cụ tốt nhất để bạn đọc từ các đầu vào có kích thước thay đổi nếu bạn cần thực hiện ngay lập tức vì dd
sẽ không đệm hiện tại đọc vào một số tương lai write()
(trừ khi bạn cấu hình rõ ràng theo cách đó với mức độ quan sát lớn hơn ibs) , nhưng sẽ thay vào đó write()
mọi thứ nó đọc ngay khi read()
nó (và tùy ý xử lý nó) .
Dưới đây là một số định nghĩa quan trọng :
ibs=
expr
- Chỉ định kích thước khối đầu vào, tính bằng byte, theo (mặc định là 512) .
expr
obs=
expr
- Chỉ định kích thước khối đầu ra, tính bằng byte, theo (mặc định là 512) .
expr
bs=
expr
- Đặt cả kích thước khối đầu vào và đầu ra thành
expr
byte, thay thế ibs=
và obs=
. Nếu không chuyển đổi khác hơn sync
, noerror
và notrunc
được chỉ định, mỗi khối đầu vào sẽ được sao chép vào đầu ra như một khối duy nhất mà không tập hợp khối ngắn.
Vì vậy, bạn thấy, khi ibs
và obs
được định nghĩa cùng nhau bs
sau đó ibs
được ưu tiên - nhưng nếu không, nếu bạn là cụ thể, thì hoặc là obs
hoặc cbs
.
Đây là một ví dụ trong đó ibs
là quan trọng nhất. Bạn có thể làm một cái gì đó như thế này nếu bạn muốn theo dõi bao lâu /dev/random
hồ bơi đầy ...
dd "ibs=$size" conv=sync "count=$lmt" \
if=/dev/random of="$somefile"
Miễn là if=
mục tiêu của bạn hoàn toàn có thể đọc được, điều đó sẽ luôn dẫn đến cùng một tệp đầu ra có kích thước tương tự, bởi vì dd
sẽ sync
sắp xếp lại các khối đọc trong null. Nói cách khác, nếu dd
read()
s cho một khối $((size=10))
$((count=5))
thời gian đầu vào và read()
tệp trả về 2 byte, sau đó 8 byte, sau đó là 12 byte, sau đó là 2 byte, sau đó là 4 byte, dd
sẽ ghi vào tệp của nó một cái gì đó như
2 read bytes 8NULs \
8 read bytes 2NULs \
10 read bytes 0NULs \
4 read bytes 6NULs \
4 read bytes 6NULs
... bởi vì dd
, theo mặc định, không trì hoãn. Vì vậy, nếu bạn cần theo dõi trong luồng và phân định việc ghi của một số quy trình khác, dd
là công cụ dành cho bạn.
Nếu bạn chỉ viết một số lượng dữ liệu vào một tệp thông thường thì ngược lại với các tuyên bố khác được đưa ra ở đây, bạn cũng có thể sử dụng dd
cho việc này - và khá dễ dàng - nhưng bạn sẽ cần nhiều hơn một và một yếu tố chặn đáng tin cậy .
Ví dụ: nếu bạn đã làm:
{ dd ibs="$size" obs="${size}x$block_factor" |
dd bs="${size}x$blockfactor" "count=$lmt"
} <infile >outfile
... khối thứ nhất dd
sẽ đệm càng nhiều ibs="$size"
khối đầu vào cần thiết để lấp đầy ít nhất một obs="${size}x$block_factor"
khối đầu ra cho mỗi write()
ống giữa nó và khối thứ hai dd
. Điều này có nghĩa là cái thứ hai dd
có thể giới hạn đầu ra một cách đáng tin cậy count="$lmt"
bởi vì tất cả các sản write()
phẩm đầu tiên sẽ khớp với kích thước khối i / o của nó - bất kể bao nhiêu read()
cái đầu tiên dd
phải làm để làm như vậy.
Và đó là cách bạn có thể sử dụng dd
để đọc các đường ống hoặc các loại tệp đặc biệt khác một cách đáng tin cậy - chỉ với một chút toán học.
/dev/random
sẽ chặn nếu không có đủ entropy có sẵn để tạo số chữ số bạn muốn. đơn giản chỉ cần có thời gian để thu thập số lượng "ngẫu nhiên" ngẫu nhiên chất lượng cao đó ... Hoặc sử dụng/dev/urandom
cho giá trị "ngẫu nhiên" ít ngẫu nhiên hơn hoặc kiểm tra nhóm entropy của bạn (trong một vòng lặp và chờ khi cần) ...