T pipeline e pnmtools - arquivo truncado

Sep 15 2020

Esta sequência de comandos funciona bem:

pngtopnm file.png 2> /dev/null > dump1
pnmfile < dump1
stdin:  PPM raw, 1920 by 1080  maxval 255
ls -l dump1
-rw-r----- 1 cmb 6220817 Sep 15 14:26 dump1

Mas refazer o pipeline para usar 'tee' trunca a saída no arquivo de despejo:

pngtopnm file.png 2> /dev/null | tee dump2 | pnmfile
stdin:  PPM raw, 1920 by 1080  maxval 255
ls -l dump2
-rw-r----- 1 cmb   49152 Sep 15 14:34 dump2

Não estou certo sobre a diferença que faz onde 'tee' está enviando stdin para o que é salvo no arquivo de despejo - por que 'dump2' está truncado e não é idêntico a 'dump1'?

cmp dump[12]
cmp: EOF on dump2 after byte 49152, in line 4

Suspeito que tenha algo a ver com 'pnmfile', já que colocar outra coisa no final do pipeline parece funcionar bem - 'dump3' tem o tamanho / conteúdo certo de dump1 e o fim do tubo ('fmt') está fazendo algo com o arquivo ...:

pngtopnm file.png 2> /dev/null  | tee dump3 |fmt -10 > dump4
ls -l dump[34]
-rw-r----- 1 cmb 6220817 Sep 15 14:41 dump3
-rw-r----- 1 cmb 6224311 Sep 15 14:41 dump4

(XUbuntu 20.04, diffutils 3.7, Netpbm 10.0, coreutils 8.30)

Respostas

1 laktak Sep 15 2020 at 22:08
pngtopnm file.png 2> /dev/null | tee dump2 | pnmfile

pnmfilesó lê até ter informações suficientes para produzir as informações do arquivo e, em seguida, fecha o tubo. Nesse ponto, o tee fecha o tubo e o dump2 também.

Experimente tee -p dump2.