我有一个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脚本的日志中公开。
请告知。
答案 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调用 有两种方法:
由于您直接调用函数,因此可以采用其他解决方案。确保原始功能名称在没有回声的情况下工作,因此不需要编辑其他脚本。
#!/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`;