Я не уверен, почему stdbuf
не работает, но вместо этого вы можете использовать команду unbuffer
. Вот простой пример:
use feature qw(say);
use strict;
use warnings;
my $output = "output.log";
open(my $OL,">", $output) or die "Could not open file '$output': $!";
my $pid = open (my $P, '-|', "unbuffer test.pl 2>&1");
while(<$P>) {
chomp;
print $OL "$_\n";
print "$_\n";
}
close $OL;
close $P;
где test.pl
задается как:
#! /usr/bin/env perl
use strict;
use warnings;
for (1..5) {
print "Hello\n";
sleep 1;
}
Вы можете установить команду unbuffer
в Ubuntu с помощью sudo apt-get install expect
Без команды unbuffer
в приведенном выше сценарии все пять строк с Hello
печатаются сразу через 5 секунд в окне терминала. Когда используется команда unbuffer
, каждую секунду появляется новая строка с Hello
.
Обновление :
Поскольку ваш сценарий называется external_program.py
, я предполагаю это программа python? Затем есть опция командной строки -u
для python
, которая отключает буферизацию, и вы можете использовать эту опцию вместо запуска unbuffer
.