我一直在阅读SO讨论如何输出到终端的线路缓冲,输出到管道或文件等通常是“块缓冲”。我在OSX上尝试以下两个管道,其目的是为传入行添加时间戳:
while [ 1 ] ; do echo $RANDOM && sleep .5 ; done | ~/bin/prepend_ts_python
和
while [ 1 ] ; do echo $RANDOM && sleep .5 ; done | ~/bin/prepend_ts_perl
Perl程序是(我对Perl知之甚少):
#!/usr/bin/perl
while ( <> ) {
print scalar(localtime()), " ";
print;
}
Python程序(显然没有预先设置时间戳)是:
#!/usr/bin/python
import sys
for line in sys.stdin:
print("foo")
使用Perl版本的管道会根据需要立即打印输出,而Python会间歇性地输出。
我的印象是,正在进行的任何缓冲都是由while
/ echo
循环确定的,因此人们建议使用unbuffer
命令管道的开始。
Perl是否有某种方法可以刷新STDIN?我认为它不会在管道中“倒退”。他们为什么不同?