这两个数字在dd的“a+b记录”统计中分别是什么意思?

bas*_*sin 19 dd

ddstats 中的前 2 行格式如下:

a+b records in
c+d records out
Run Code Online (Sandbox Code Playgroud)

为什么是 2 个数值?这个加号是什么意思?它通常是a+0,但有时当我使用更大的块大小时,dd 打印0+b records out

Min*_*ang 17

这意味着该bs大小的完整块加上大小小于 b 的额外块。

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
Run Code Online (Sandbox Code Playgroud)

编辑:froschutz 的回答提到了另一种生成非完整块的情况。值得一读。另请参阅https://unix.stackexchange.com/a/17357/73443


fro*_*utz 12

0+b records out因为b>1从管道或其他无法bs=X足够快地提供数据的来源读取时,通常是不完整的读取。您可以使用 强制dd等待完整的数据块iflag=fullblock。如果您还使用count=Xas count 也计算不完整的块,则此选项特别有用,因此如果没有 fullblock 则它不可靠...


mik*_*erv 5

有许多标准命令行实用程序可以挂在描述符上并等待输入。这几乎就是它们的工作方式。dd它的独特之处在于它可以向您显示描述符现在的样子。

就个人而言,我并不真正理解 GNUiflag=fullblock选项背后的用处。我的意思是,您cat至少可以轻松地输入您的输入,而完全不必担心 i/o 块大小。

但是dd可以成为流的一部分- 它可以在合理的现代系统上read()/write()边界上进行。

{ (     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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

ddread()每个输入块做一个。如果它尝试访问的文件read()没有它所请求的那么多数据,则无关紧要 -一个被 read()视为一个输入块。这就是它的工作原理 - 这是dd的主要实用程序。

当它完成它的工作时,dd报告它处理过的所有输入/输出块。再次运行上面的命令,但这次删除标准输出......


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
Run Code Online (Sandbox Code Playgroud)

每次ddread(0,&in,64) read回来了短-因为它的标准输入文件描述符没有足够的字节等待它时,它使人们满足其要求。因此dd read()0 个完整输入记录和 2 个短输入记录。这就是那些报告的意思。