Как автоматически залить linux "echo -n" - PullRequest
2 голосов
/ 16 февраля 2011

С учетом следующего скрипта 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; 

1 Ответ

6 голосов
/ 16 февраля 2011

while(<CMD>) читает строку за раз. echo -n не отправляет новые строки, поэтому нет «строки» для чтения, пока не будет достигнут EOF. Вы можете использовать read или getc вместо значения readline, которое вы получаете с <CMD>, чтобы читать символ за раз. Также в CPAN есть модуль Term::ReadKey, который позволяет неблокировать чтение одного символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...