tee pipeline dan pnmtools - file terpotong

Sep 15 2020

Urutan perintah ini berfungsi dengan baik:

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

Tetapi mengulang pipeline untuk menggunakan 'tee' akan memotong output di file dump:

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

Saya tidak jelas apa bedanya di mana 'tee' mengirim stdin ke apa yang disimpan di file dump - mengapa 'dump2' terpotong, dan tidak identik dengan 'dump1'?

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

Saya menduga ini ada hubungannya dengan 'pnmfile', karena meletakkan sesuatu yang lain di ujung pipa tampaknya berfungsi dengan baik - 'dump3' adalah ukuran yang tepat / konten yang sama dengan dump1, dan ujung pipa ('fmt') sedang melakukan sesuatu pada file ...:

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)

Jawaban

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

pnmfilehanya membaca sampai memiliki cukup informasi untuk mengeluarkan informasi file dan kemudian menutup pipa. Kemudian tee menutup pipa dan dump2 juga.

Coba tee -p dump2.