我有以下脚本:
#!/usr/bin/perl -w
use strict;
$| = 1;
foreach (1..5) {
print $_ . "\r";
sleep 1;
}
print "\n";
这表现出预期的效果:数字1,2,3,4,5在控制台上相互覆盖。
$ ./loop.pl | hexdump -C
00000000 31 0d 32 0d 33 0d 34 0d 35 0d 0a |1.2.3.4.5..|
但是,另一个脚本(旨在显示隐藏长时间运行的程序的大型输出,例如:long_running_program | tee output | ./progr
)
#!/usr/bin/perl -w
use strict;
$| = 1;
while (<>) {
chomp;
print $_ . "\r";
}
print "\n";
输入重定向后,会产生不同的行为:
perl -wle 'foreach (1..5) { print $_; sleep 1 }' | ./progr.pl
五秒钟没有看到输出,然后可以看到“ 5”。但是hexdump显示相同的输出(五秒钟后)
$ perl -wle 'foreach (1..5) { print $_; sleep 1 }' | ./progr.pl | hexdump.exe -C
00000000 31 0d 32 0d 33 0d 34 0d 35 0d 0a |1.2.3.4.5..|
这不是Perl特有的。以下C代码
for (int i = 0; i < 6; ++i) {
printf("%d\r",i);
fflush(stdout);
sleep(1);
}
puts("\n");
显示数字彼此覆盖,但是
#define SIZE (256 * 1024)
char buffer[SIZE];
int line = 0;
while (fgets(buffer,SIZE,stdin)) {
printf("%d\r",++line);
fflush(stdout);
}
puts("\n");
在管道末端时,仅在输入耗尽后才显示输出。
甚至没有
setvbuf(stdout,NULL,_IONBF,0);
似乎有帮助。
我通过SSH连接到远程Linux(RHEL6)系统并在Cygwin本地进行了所有尝试。
(通过@Fredrik和@usr的更正进行编辑)