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

Yas*_*ash 5 unix linux shell perl external

我有两个脚本,即shell_script.shperl_script.pl.

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

perl_script.pl :它具有要实现的代码和逻辑,用于调用等.

的内容shell_script.sh文件是为下:

bash-4.2$ cat shell_script.sh

的内容perl_script.pl文件是为下:

#!/bin/bash

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

func_2 ()
{
  echo "function definition"
}
Run Code Online (Sandbox Code Playgroud)

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

Håk*_*and 8

要调用shell 函数,shell需要知道它的定义.实现这一目标的一种方法是首先source使shell 定义函数的文件.然后,在不退出shell的情况下,调用该函数.从Perl脚本,例如:

system 'bash', '-c', 'source shell_script.sh; func_1';
Run Code Online (Sandbox Code Playgroud)


zdi*_*dim 6

要使用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"
}
Run Code Online (Sandbox Code Playgroud)

在Perl(单线)

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

其中qx与反引号相同,但也许更清晰.如果你需要从这些函数返回,我会使用反引号.如果您/bin/sh没有链接到bash†,bash明确致电

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

对数组的赋值放入qx列表上下文中,其中它返回STDOUT它作为行列表运行的内容.这可用于将返回与不同函数分开,如果它们各自返回一行.该a1,b1a2,b2是传递到的参数f1f2.

打印

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

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

如果没有必要返回,但功能只需要做他们的事情,你可以使用

system('/bin/bash', '-c', 'source ... ') 
Run Code Online (Sandbox Code Playgroud)

就像Håkon的回答一样


/bin/sh确实如此,但这通常会降级为bash.检查你的系统(/bin/sh很可能是另一个shell的链接).或者确保bash运行命令

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

有关此示例的说明,请参阅文本.