我有两个脚本,分别是shell_script.sh
和perl_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
中定义)?
答案 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
。如果它们各自返回一行,则可以将它们与不同的函数分开使用。 STDOUT
和a1,a2
是传递给b1,b2
和f1
的参数。
打印
got: f1: t=a1 u=a2 got: f2: t=b1 u=b2
这做出了一些(合理的)假设。
如果不需要返回,但函数只需要执行其操作,则可以使用
f2
†确实是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`;
...