С учетом следующего скрипта bash:
testing.sh:
for i in {1..50};
do
sleep 0.1;
echo -n $i;
done
Как сделать вывод PERL в режиме реального времени с каждым эхом? Он прекрасно работает, если его echo
, но echo -n
, кажется, заставляет PERL думать об одном большом эхо вместо отдельного эха.
PERL-код, который работает с обычным эхом
$| = 1;
open CMD, "testing.sh 2>&1 |";
while (<CMD>) {
print "$_ \r";
}
close CMD;
Если вы запустите его, вы увидите, что PERL ничего не печатает в течение 5 секунд (50 * 0,1 с). Если вы просто измените echo -n
на echo
, он будет выводиться в режиме реального времени.
Идея в том, что я использую команду echo -ne "...\r"
в bash и хочу добиться того же эффекта, используя PERL.
редактирование:
Мой пример 1..50 был просто для демонстрации. Фактически, я хочу напечатать в PERL в строке прогресса bash, которая будет обновляться как:
[####..............................................] 6.20%
[####..............................................] 6.40%
[#####.............................................] 7.40%
за исключением того, что bash будет использовать \ r вместо \ n. Это похоже на индикатор выполнения wget. Я надеюсь получить такой же эффект в PERL. Хорошо, что я вижу, что read может читать по X-символам, и echo будет иметь заданную длину. Я не могу найти хороших примеров, которые бы соответствовали тому, что я пытаюсь сделать.
редактировать 2:
Я получил то, что мне нужно прочитать ...
Сейчас я работаю над улучшением этого с помощью индикатора выполнения. Индикатор выполнения занимает ровно 60 байтов, и я использую следующее:
$| = 1;
open CMD, "testing.sh 2>&1 |";
my ($buf, $data, $n);
while (($n = read CMD, $data, 60) != 0) {
print $data;
}
close CMD;