此命令序列工作正常:
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
但重做管道以使用“tee”截断输出在转储文件中:
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
我不清楚“tee”将标准输入发送到转储文件中保存的内容有何区别 - 为什么“dump2”被截断,并且与“dump1”不同?
cmp dump[12]
cmp: EOF on dump2 after byte 49152, in line 4
我怀疑它与“pnmfile”有关,因为在管道末尾放置其他内容似乎可以正常工作 -“dump3”的大小/内容与 dump1 相同,并且是管道的末尾(“fmt”)正在对文件执行某些操作...:
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)
答案1
pngtopnm file.png 2> /dev/null | tee dump2 | pnmfile
pnmfile
只读取直到有足够的信息来输出文件信息,然后关闭管道。此时,tee 会关闭管道,并且 dump2 也会关闭。
尝试tee -p dump2
。