Les 2 premières lignes dans les statistics dd
ont le format suivant:
a+b records in c+d records out
Pourquoi 2 valeurs numériques? Que signifie ce signe plus? C'est généralement a+0
, mais parfois quand j'utilise une plus grande taille de bloc, dd imprime 0+b records out
Cela signifie que des blocs complets de cette taille de bs
plus des blocs supplémentaires avec une taille plus petite que le 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
Edit : la réponse de frostschutz mentionne un autre cas pour générer des blocs non complets. A lire. Voir aussi https://unix.stackexchange.com/a/17357/73443 .
0+b records out
pour b>1
sont généralement des lectures incomplètes lors de la lecture à partir d'un tuyau ou d'une autre source qui ne peut pas fournir bs=X
de données assez rapidement. Vous pouvez forcer dd
à attendre des blocs complets de données en utilisant iflag=fullblock
. Cette option est particulièrement utile si vous utilisez aussi count=X
car le nombre count également les blocs incomplets, donc il n'est pas fiable sans fullblock …
Il existe des dizaines d'utilitaires de command line standard qui peuvent s'accrocher à un descripteur et attendre la saisie. C'est à peu près comme ça qu'ils travaillent tous. dd
est unique en ce sens qu'il peut vous montrer à quoi ressemble un descripteur en ce moment .
Personnellement, je ne comprends pas vraiment l'utilité derrière l' iflag=fullblock
GNU iflag=fullblock
. Je veux dire, vous pouvez simplement cat
votre input au less aussi facilement et sans avoir à vous soucier de la taille des blocs d'E / S du tout.
Mais dd
peut prendre une partie d'un stream – et il peut le faire aux limites read()
/ write()
sur un système raisonnablement moderne.
{ ( 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
fait une seule read()
par bloc d'input. Si le file qu'il essaie de read()
n'a pas autant de données qu'il a demandé, cela n'a pas d'importance – l' une read()
count comme un bloc d'input. C'est comme ça que ça marche, c'est l'utilitaire principal de dd
.
Quand il a fait son travail, dd
rend count de tous les blocs d'input / sortie traités. Exécuter la command ci-dessus à nouveau, mais en supprimant stdout à la place cette fois-ci …
dd: warning: partial read (3 bytes); suggest iflag=fullblock 0+2 records in 2+0 records out 128 bytes (128 B) copyd, 1.00161 s, 0.1 kB/s
Chaque fois que dd
a read(0,&in,64)
read
est revenu court – parce que son descripteur de file stdin n'avait pas suffisamment d'octets pour qu'il réponde à sa requête quand il l'a fait. Et donc dd
read()
0 inputs complètes et 2 courtes. C'est ce que signifient ces rapports.