如何从perl脚本调用shell子例程

时间:2015-05-19 05:18:25

标签: perl shell

我有一个shell脚本,其中有两个子程序写入参数,按摩该参数&然后提供新的价值作为输出。

许多其他shell脚本都使用此脚本。现在我有一个Perl脚本,我想用参数调用这些shell子例程。以下是我的代码:

#! /bin/sh
extract_data()
{
  arg1 = $1
  // massage data code
  output=massaged data 
  return 0
}

Perl脚本:

my $output = `source /path/my_shell-script.sh; extract_data arg1`;

所以这里我想将shell子例程的输出变量值赋给Perl脚本的输出变量。但是我发现它只有在我在shell子程序中回显输出变量时才可用。如

#! /bin/sh
extract_data()
{
arg1 = $1
// massage data code
output=massaged data
echo $output 
}

我不想回显输出变量,因为它是敏感数据&将在其他shell脚本的日志中公开。

请告知。

3 个答案:

答案 0 :(得分:2)

当你使用时,没有任何文件描述符(默认情况下这是stdout,stderr和stdin)在两个进程之间进行交互是不可能的 系统,或``甚至open2 / open3来电。

但如果问题只是你不想破坏shell脚本的代码,你可以用shell中的另一个函数包装它并从perl调用它。 你可以这样做:

将代码添加到my_shell-script.sh

print_output()
{
  echo $output
}

你的perl脚本:

my $output = `source /path/my_shell-script.sh; extract_data arg1; print_output`;

但这太可怕了。不要使用全局变量。这可能是一个很好的峰值。但最好使用return

答案 1 :(得分:1)

my $output = `source /path/my_shell-script.sh; extract_data arg1; echo \$output`;

你的shell函数正在shell中设置一个变量。但是当shell退出时,该变量将丢失。你需要将它打印到stdout,这是Perl的反引号所捕获的。

答案 2 :(得分:1)

你想在Perl调用my_shell-script.sh时有一个echo,而不是在另一个脚本调用它时。脚本必须决定它是否被Perl调用 有两种方法:

  1. 使用参数/选项告诉脚本必须输出结果
  2. 让my_shell-script.sh检查父进程,并在父进程为perl时回显。
  3. 由于您直接调用函数,因此可以采用其他解决方案。确保原始功能名称在没有回声的情况下工作,因此不需要编辑其他脚本。

    #!/bin/sh
    extract_data_process()
       arg1=$1
       // massage data code
       output=massaged data
       echo $output 
    }
    
    extract_data()
    {
       extract_data_process $1 >/dev/null 2>&1
       return 0
    }
    
    extract_data_verbose()
    {
       output=$(extract_data_process $1 2>&1)
       echo "${output}"
       return 0
    }
    

    Perl脚本:

    my $output = `source /path/my_shell-script.sh; extract_data_verbose arg1`;