Yas*_*ash 5 unix linux shell perl external
我有两个脚本,即shell_script.sh和perl_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?
要调用shell 函数,shell需要知道它的定义.实现这一目标的一种方法是首先source使shell 定义函数的文件.然后,在不退出shell的情况下,调用该函数.从Perl脚本,例如:
system 'bash', '-c', 'source shell_script.sh; func_1';
Run Code Online (Sandbox Code Playgroud)
要使用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,b1和a2,b2是传递到的参数f1和f2.
打印
got: f1: t1=a1 u1=b1 got: f2: t2=a2 u2=b2
这做出了一些(合理的)假设.
如果没有必要返回,但功能只需要做他们的事情,你可以使用
system('/bin/bash', '-c', 'source ... ')
Run Code Online (Sandbox Code Playgroud)
† /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)
有关此示例的说明,请参阅文本.
| 归档时间: |
|
| 查看次数: |
594 次 |
| 最近记录: |