来自perl脚本的bash终端打印中的回车\ r \ n导致冻结

时间:2014-06-04 10:58:11

标签: linux perl bash

我使用Ubuntu 12.04从bash中的perl脚本打印进度。当我使用它时:

foreach my $filename (sort @files) {
    print "Processing $filename...\n";

它打印每个进度线,每个打印之间的间隙约为2秒,这很好。但是有一些好文件,所以它很吵。我试着改用它:

print "\rProcessing $filename...";

但是现在我没有输出任何输出,直到脚本到达最后一个文件,然后这是我看到的唯一打印语句(最后一个)。顺便说一下,我并不关心删除之前打印的语句,因为每个语句的长度都完全相同。

但是,我可以在bash中执行seq 1 1000000 | while read i; do echo -en "\r$i"; done并且它可以正常工作。

2 个答案:

答案 0 :(得分:3)

您可以在perl脚本中尝试无缓冲输出,

$| = 1;

答案 1 :(得分:2)

您是Suffering from Buffering 。所提供的链接将带您阅读大约1998年由Perc Journal撰写的优秀文章,来自Marc Jason Dominus(高阶Perl的作者)。这篇文章可能已有十多年的历史了,但今天的主题和他写这篇文章的时候一样重要。

mpapec提出了$| = 1;技术。我想补充一点,在Perl社区的主要思想中,似乎$| = 1优于$|++,因为它的含义更清晰。我知道,自动增量也非常简单,但是当应用$|++时,每个看过代码的人都会知道--的行为(没有查找)在perlvar)。我碰巧也喜欢本地化Perl"特殊变量的任何修改"因此,效果不会消失到代码的其他部分,这些部分可能对默认Perl行为的特定更改不起作用。