Нужен индикатор выполнения для команды Perl system () с использованием T: R:G mod

#perl #libreadline #progress-indicator

#perl #libreadline #индикатор выполнения

Вопрос:

Мне нужен индикатор выполнения, который принимает выходные данные Perl

    system('make')
  

и для каждой строки, выводимой в стандартный вывод из команды make, я хочу выводить точку в качестве индикатора выполнения. К сожалению, я использую термин::ReadLine::Gnu Perl mod.

Как мне перенаправить стандартный вывод для захвата и подсчета строк по мере выполнения команды make?

Комментарии:

1. Вы также можете найти используемый термин::ProgressBar .

Ответ №1:

 #!/usr/bin/perl

my $command = "make";

open (my $cmd, "$command |");
while(<$cmd>){
  print ".";
}
print "n";
  

Комментарии:

1. Я рекомендую использовать для этого три аргумента open : open my $cmd, '-|', $command or die $!; Это безопаснее и эффективнее.

2. хороший совет, я использую версию с тремя аргументами исключительно для файлов, почему бы и не для каналов? Кроме того, это может быть случай, когда использование печати поверх матрицы может иметь свои преимущества.

3. Вы захотите автоматически сбросить стандартный вывод, иначе он будет ждать целую строку точек перед печатью. use IO::Handle; STDOUT->autoflush(1)

4. да, добавьте $outStatus=$?; внутри цикла while, затем после цикла добавьте строку типа print «$command была УСПЕШНОЙ n», если ($ outStatus ~ ~ 0);

Ответ №2:

 make >amp; >(while read f; do echo -n .; done; echo)
  

Очевидно, что это решение командной строки, но точка в качестве индикатора выполнения — это точка.

Вы, конечно, могли бы вставить туда tee, чтобы сохранить копию make в файл в случае проблем.

Поскольку вам, похоже, не понравилось (ни поддержано, ни принято) решение оболочки по какой-то необъяснимой причине, вот чисто perl:

 if (open(X,"make|")) { local($|)=1; while(<X>) { print "."; } close(X); print "n";}
  

Комментарии:

1. Я не думал о том, чтобы заставить оболочку выполнять тяжелую работу… интересно.

2. @bitbucket: Добавлена опция чистого perl к предыдущему ответу командной строки.

3. Мне нужно было немного поспать… Сегодня я тестирую решения.