Hai số này có ý nghĩa gì tương ứng trong các số liệu thống kê của dd a + b?


16

2 dòng đầu tiên trong ddsố liệu thống kê có định dạng sau:

a+b records in
c+d records out

Tại sao 2 giá trị số? Dấu cộng này có ý nghĩa gì? Nó thường a+0, nhưng đôi khi khi tôi sử dụng kích thước khối lớn hơn, dd in0+b records out

Câu trả lời:


16

Nó có nghĩa là các khối đầy đủ có bskí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 .


10

0+b records outcho b>1thườ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=Xdữ liệu đủ nhanh. Bạn có thể buộc ddphả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=Xnhư đế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 ...


4

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. ddlà 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=fullblocktùy chọn GNU . Ý tôi là, bạn chỉ có thể catnhậ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 ddcó 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

ddkhô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à ddtiện ích chính.

Khi nó đã hoàn thành công việc của mình, ddbá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 ddtôi read(0,&in,64) readtrở 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.