如何在Perl脚本中调用函数(在Shell脚本中定义)

时间:2018-06-23 19:38:59

标签: linux shell perl unix perl-module

我有两个脚本,分别是shell_script.shperl_script.pl

shell_script.sh:它具有函数定义,当从Perl脚本中调用该函数时,将在Linux上以批处理模式执行某些命令。

perl_script.pl:具有要实现的代码和逻辑,要调用的功能等。

shell_script.sh文件的内容如下:

bash-4.2$ cat shell_script.sh

#!/bin/bash

# Function Definitions
func_1 ()
{
  echo "function definition"
}

func_2 ()
{
  echo "function definition"
}

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)";

如何在perl脚本func_1()中调用函数shell_script.sh(在perl_script.pl中定义)?

3 个答案:

答案 0 :(得分:8)

要调用外壳程序功能,外壳程序需要知道其定义。一种实现方法是让外壳程序首先source定义函数的文件。然后,在不退出外壳的情况下,调用该函数。在Perl脚本中,例如:

system 'bash', '-c', 'source shell_script.sh; func_1';

答案 1 :(得分:5)

要使用var audio = new Audio("filename"); function play(){ audio.play(); } //for pausing //to play from where it left off, use the play method again function pause(){ audio.pause(); } 功能,您需要先进入bash。因此,在将您置于反引号或bash中的Perl脚本中,您位于system进程中。然后,在该过程中,您可以bash使用功能脚本,将其引入并执行这些功能

funcs.sh

source

和Perl(单行)

#!/bin/bash

function f1 {
    t=$1
    u=$2
    echo "f1: t=$t u=$u"
}

function f2 {
    t=$1
    u=$2
    echo "f2: t=$t u=$u"
}

其中qx与反引号相同,但可能更清楚。如果您需要从这些函数中返回,我会使用反引号。如果您的perl -wE' @r = qx(source funcs.sh; f1 a1 a2; f2 b1 b2); print "got: $_" for @r ' 未链接到/bin/sh ,则显式调用bash

bash

分配给数组将perl -wE' @r = qx(/bin/bash -c "source funcs.sh; f1 a1 a2; f2 b1 b2"); print "got: $_" for @r ' 放在列表上下文中,在数组上下文中,它以行列表的形式返回qx。如果它们各自返回一行,则可以将它们与不同的函数分开使用。 STDOUTa1,a2是传递给b1,b2f1的参数。

打印

got: f1: t=a1 u=a2
got: f2: t=b1 u=b2

这做出了一些(合理的)假设。

如果不需要返回,但函数只需要执行其操作,则可以使用

f2

Håkon's answer


†确实是system('/bin/bash', '-c', 'source ... ') ,但通常降级为/bin/sh。检查系统(bash可能是到另一个shell的链接)。或确保/bin/sh运行命令

bash

有关示例的说明,请参见文字。

答案 2 :(得分:3)

解决这个问题是多余的,但是Env::Modify提供了一种使Shell函数在Perl中可用的方法。借助Env::Modify,您可以说一次导入Shell函数,并在子序列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`;
...