Câu trả lời:
Nó có nghĩa là các khối đầy đủ có bs
kích thước đó cộng với các khối bổ sung có kích thước nhỏ hơn bs.
pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1
Chỉnh sửa : câu trả lời của frostschutz đề cập đến một trường hợp khác để tạo ra các khối không đầy đủ. Đáng đọc. Xem thêm /unix//a/17357/73443 .
0+b records out
cho b>1
thường là các lần đọc không đầy đủ trong khi đọc từ một đường ống hoặc một nguồn khác không thể cung cấp bs=X
dữ liệu đủ nhanh. Bạn có thể buộc dd
phải chờ cho khối dữ liệu đầy đủ sử dụng iflag=fullblock
. Tùy chọn này đặc biệt hữu ích nếu bạn cũng đang sử dụng count=X
như đếm cũng đếm các khối không hoàn chỉnh để nó không đáng tin cậy nếu không có fullblock ...
Có hàng tá tiện ích dòng lệnh tiêu chuẩn có thể treo trên một bộ mô tả và chờ nhập liệu. Đó là khá nhiều cách tất cả họ làm việc. dd
là duy nhất ở chỗ nó có thể cho bạn thấy một mô tả trông như thế nào ngay bây giờ .
Cá nhân, tôi không thực sự hiểu sự hữu ích đằng sau iflag=fullblock
tùy chọn GNU . Ý tôi là, bạn chỉ có thể cat
nhập dữ liệu của mình ít nhất một cách dễ dàng và không phải lo lắng về kích thước khối i / o.
Nhưng dd
có thể lấy một phần của luồng - và nó có thể thực hiện tại read()
/ write()
ranh giới trên một hệ thống hợp lý hiện đại.
{ ( sleep 1 #don't write() til dd is definitely setup
printf 123 #write() 3 bytes
printf %-30s\\n 456 #write() 31 bytes
printf you\ there\? #write() 10 bytes
)| dd bs=64 count=2 conv=sync| #2 64 byte read()/write() \0-padded blocks
od -vtc #show it with octal radices
} 2>/dev/null #drop stderr
0000000 1 2 3 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000040 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000060 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000100 4 5 6
0000120 \n \0
0000140 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000160 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000200
dd
không một khối read()
trên mỗi đầu vào. Nếu tệp mà nó cố gắng read()
không có nhiều dữ liệu như đã yêu cầu thì nó không thành vấn đề - một tệp read()
được tính là một khối đầu vào. Đó là cách nó hoạt động - đó là dd
tiện ích chính.
Khi nó đã hoàn thành công việc của mình, dd
báo cáo về tất cả các khối đầu vào / đầu ra mà nó đã xử lý. Chạy lại lệnh trên, nhưng thay vào đó, bỏ thiết bị xuất chuẩn ...
dd: warning: partial read (3 bytes); suggest iflag=fullblock
0+2 records in
2+0 records out
128 bytes (128 B) copied, 1.00161 s, 0.1 kB/s
Mỗi lần dd
tôi read(0,&in,64)
read
trở lại ngắn - bởi vì mô tả tập tin stdin của nó không có đủ byte chờ đợi để đáp ứng yêu cầu của nó khi nó đã làm cho nó. Và như vậy dd
read()
0 hồ sơ đầu vào đầy đủ, và 2 hồ sơ ngắn. Đó là những gì các báo cáo có nghĩa.