Как вызвать функцию (определенную в сценарии оболочки) в сценарии Perl - PullRequest
0 голосов
/ 23 июня 2018

У меня есть два сценария, а именно shell_script.sh и perl_script.pl.

shell_script.sh: в нем есть определения функций, которые при вызове из сценария Perl будут выполнять определенные команды в Linux в пакетном режиме.

perl_script.pl: в нем есть код и логикареализованы, функции для вызова и т.д.*

bash-4.2$ cat perl_script.pl
#!/usr/bin/perl

use Getopt::Long;

my $var1;
my $var1;

GetOptions("var1=s"     => \$var1,
       "var2=s" => \$var2,
       "help|?" => \$help );

if ($help)
{
    HelpMenu();
}

print " Can I call the func_1 (defined in shell script) with arguments here..?? (in this perl script)";

Как я могу вызвать функцию func_1() (которая определена в shell_script.sh) в скрипте perl perl_script.pl?

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

Для вызова функции оболочки оболочке необходимо знать ее определение.Один из способов добиться этого - сначала создать оболочку source файла, который определяет функцию.И затем, не выходя из оболочки, вызовите функцию.Из сценария Perl это будет, например:

system 'bash', '-c', 'source shell_script.sh; func_1';
0 голосов
/ 24 июня 2018

Это избыточно для этой проблемы, но Env::Modify предоставляет способ сделать функции оболочки доступными в Perl. С Env::Modify вы можете, скажем, импортировать функции оболочки один раз и использовать их снова и снова в вызовах подпоследовательности system.

use Env::Modify qw(:bash system source qx);

# import the shell functions
system("source shell_script.sh ; export -f func_1 func_2");
# alternate: put  "export -f func_1 func_2"  at the end of shell_script.sh and call
source("shell_script.sh");

# use the shell functions
system("func_1");
$output = `func_2`;
...
0 голосов
/ 23 июня 2018

Чтобы использовать bash функции, вы должны быть в bash.Таким образом, в сценарии Perl, который помещает вас в кавычки или system, где вы находитесь внутри bash процесса .Затем внутри этого процесса вы можете source сценарий с функциями, которые будут их вводить, и выполнять их

funcs.sh

#!/bin/bash

function f1 {
    t1=$1
    u1=$2
    echo "f1: t1=$t1 u1=$u1"
}

function f2 {
    t2=$1
    u2=$2
    echo "f2: t2=$t2 u2=$u2"
}

ив Perl (однострочный)

perl -wE'
    @r = qx(source funcs.sh; f1 a1 b1; f2 a2 b2); 
    print "got: $_" for @r
'

, где qx * ​​1019 * - оператор для обратных кавычек, но, возможно, более понятный.Я использую обратные пометки в случае, если вам нужно вернуться из этих функций.Если ваш /bin/sh не связан с bash, тогда вызовите bash явно

perl -wE'
    @r = qx(/bin/bash -c "source funcs.sh; f1 a1 b1; f2 a2 b2"); 
    print "got: $_" for @r
'

Присвоение массива помещает qx в контекст списка, в котором онвозвращает STDOUT того, что было запущено в виде списка строк.Это можно использовать для отделения возврата от разных функций, если они возвращают по одной строке каждая.a1,b1 и a2,b2 являются аргументами, передаваемыми f1 и f2.

Prints

got: f1: t1=a1 u1=b1
got: f2: t2=a2 u2=b2

Это делает некоторые (разумные) предположения.

Если в возврате нет необходимости, но функции должны выполнять только свои функции, вы можете использовать

system('/bin/bash', '-c', 'source ... ') 

, как в Ответ Хокон


Это на самом деле /bin/sh, но это часто сводится к bash.Проверьте вашу систему (/bin/sh, скорее всего, ссылка на другую оболочку).Или убедитесь, что bash выполняет команду

my @ret = qx( /bin/bash -c "source base.sh; f1 a1 b1; f2 a2 b2" );

См. Текст для объяснения этого примера.

...