【问题标题】:Carriage return \r in bash terminal printing from perl script causing freeze来自perl脚本的bash终端打印中的回车\ r导致冻结
【发布时间】:2014-07-24 23:53:39
【问题描述】:

我正在使用 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 并且效果很好。

【问题讨论】:

    标签: linux perl bash


    【解决方案1】:

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

    $| = 1;
    

    【讨论】:

    • 不错,很快!
    【解决方案2】:

    你是Suffering from Buffering。提供的链接将您带到 Marc Jason Dominus(Higher-Order Perl 的作者)大约 1998 年的 Perl Journal 中的一篇优秀文章。这篇文章可能已经有十多年的历史了,但这个话题在今天和他写这篇文章时一样重要。

    正如mpapec 建议的$| = 1; 技术。我要补充一点,在 Perl 社区的主要思想中,$| = 1 似乎比 $|++ 更可取,因为它的含义更清晰。我知道,自动增量也很简单,但是每个会查看您的代码的人都知道$| 在应用++-- 时的行为(无需在perlvar 中查找)。我碰巧也更喜欢本地化对 Perl 的“特殊变量”的任何修改,这样效果就不会影响到代码的其他部分,这些部分可能不会对默认 Perl 行为的特定更改起到很好的作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多