как вернуть результаты из сценария оболочки в perl? - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь получить результаты rtt (например, 149.982 / 150.125 / 150.280 / 0.265 мс) из сценария оболочки в perl, теперь ping. sh может получить результаты rtt из сценария оболочки, но как вернуть результаты и как получить результаты возврата из сценария оболочки в perl?

call.pl

my $answer= system (".  /home/george/ping.sh;getrtt  8.8.8.8");
if($answer == 0)
{
    exit($answer >> 8);
    my $results =  ##how to get the rtt results from ping.sh ???


 }

ping. sh

getrtt()
{
   if  ping $ip -c 5 -t 5 | grep -oP '[+-]?([0-9]*[.])?[0-9]+\/[+-]?([0-9]*[.])?[0-9]+\/[+-]?([0-9]*[.])?[0-9]+\/[+-]?([0-9]*[.])?[0-9]+ ms'
   then
      echo ##how to retrun the results (ping $ip -c 5 -t 5 | grep -oP '[+-]?([0-9]*[.])?[0-9]+\/[+-]?([0-9]*[.])?[0-9]+\/[+-]?([0-9]*[.])?[0-9]+\/[+-]?([0-9]*[.])?[0-9]+ ms')???
   else
      echo '1'
 fi 
 }

1 Ответ

1 голос
/ 10 апреля 2020

внутри функции оболочки:

  1. вы можете использовать синтаксис $() для получения результата пинга в переменной
  2. вы можете повторить результат

в программе perl: вы можете открыть канал | и прочитать pd файла оболочки

. sh:

getrtt()
{
   ip=$1;
   if result=$(ping $ip -c 5 -t 5 | grep -P 'ms$')
   then
      echo $result
   else
      echo '1'
 fi
 }

graboutput файла .pl:

#!/usr/bin/perl

local *EXEC; open EXEC,'. ./ping.sh && getrtt 8.8.8.8|' or die $!;
while (<EXEC>) {
 # do something with the result
 print;
}
close EXEC;

exit $?;

1; # $Source: /my/perlscritps/graboutput.pl$

Примечание. Пинг в моем окне linux не имеет того же формата, например: 5 packets transmitted, 0 received, +5 errors, 100% packet loss, time 4005ms, поэтому я изменил параметр -oP команды grep w / i ping. sh

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