执行期间管道数据

时间:2014-09-15 07:12:25

标签: linux bash perl

我想在不等待执行结束的情况下实时修改程序的输出。

例如我有这个程序: speak.pl

#!/usr/bin/env perl 
use 5.010;
use Time::HiRes qw( usleep );
for(1..10) {
    say "I am counting: $_";
    usleep(100000);
}

这一个: wrapper.pl

#!/usr/bin/env perl     
print "You are saying: $_\n" while(<>);

执行此命令时:

./speak.pl | ./wrapper.pl 

不幸的是,在 speak.pl 终止执行之前没有任何事情发生。有没有办法在执行期间修改 speak.pl 的输出数据?

我也试过传递一个中间文件:

./speak.pl > tmp & ./read.pl tmp

有了这个:

#!/usr/bin/env perl 
use 5.010;
use File::Tail;
my $file=File::Tail->new(name=>$ARGV[0], maxinterval=>300, adjustafter=>7);
while (defined(my $line=$file->read)) {
  print "You're saying: $line";
}

但是再次看来输出文件只在执行结束时写入。

任何线索?

P.S。我在Cygwin上运行我希望它没有任何区别。

1 个答案:

答案 0 :(得分:2)

可能与缓冲有关。数据在通过管道发送之前存储到一定大小(或在执行结束时刷新)。

尝试使用usig stdbuf -i0 -o0 -e0 ./speak.pl | stdbuf -i0 -o0 -e0 ./wrapper.pl禁用缓冲。

当您使用perl时,请考虑this link禁用perl自己的缓冲机制。