我试图解决一个问题,在我看来,你无法将开放的db2连接传递给子shell.
我的代码组织如下:
驱动程序脚本(中my_driver.sh)
# foo.sh defines baz() bar(), which use a db2 connection
# Also the "$param_file" is set in foo.sh!
source foo.sh
db2 "connect to $dbName USER $dbUser using $dbPass"
function doit
{
cat $param_file | while read params
do
baz $params
bar $params
done
}
doit
Run Code Online (Sandbox Code Playgroud)
我简化了我的代码,但上面的内容已经足够了.我从上面开始:
my_driver.sh
Run Code Online (Sandbox Code Playgroud)
现在,我真正的问题是子shell中没有db2连接:
我累了:
. my_driver.sh
Run Code Online (Sandbox Code Playgroud)
没有帮助
如果我从命令行手动执行:
source foo.sh
Run Code Online (Sandbox Code Playgroud)
我$params手动设置:
baz $params
bar $params
Run Code Online (Sandbox Code Playgroud)
然后它确实有效!如此看来,doit还是别的什么行为,如果bar和baz从子shell执行.
如果我能以某种方式弄清楚如何将db2 open连接传递给subshell,那我会很高兴.
否则,这些shell函数在我看来它们在子shell中运行.有办法吗?
我的目标是在Perl的@INC数组中注入它始终可以工作的状态,并且在任何情况下都可以调用perl
为了使它SpecialMoudle.pm不在默认 @INC数组中时起作用,我添加了:
PERLLIB=/path/to/special/module
Run Code Online (Sandbox Code Playgroud)
在/etc/environmentLinux盒子上的文件中,它按出售方式工作:
$ perl -le "print for @INC"; perl -MSpecialMoudle -e "print qq/Yep SpecialMoudle.pm loaded\n/"
/path/to/special/module
/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8
.
Run Code Online (Sandbox Code Playgroud)
我得到:
Yep SpecialMoudle.pm loaded
Run Code Online (Sandbox Code Playgroud)
但是当我在同一台机器上SSH时
$ ssh $(hostname -i) 'perl -le "print for @INC"; perl -MSpecialMoudle -e "print qq/Yep SpecialMoudle.pm loaded\n/"'
Run Code Online (Sandbox Code Playgroud)
我得到相同的:
/path/to/special/module
/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.8
/usr/lib/perl5/site_perl
/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/vendor_perl/5.8.8
/usr/lib/perl5/vendor_perl
/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi
/usr/lib/perl5/5.8.8
.
Run Code Online (Sandbox Code Playgroud)
但是奇怪的是我也得到了:
在@INC中找不到SpecialMoudle.pm(@INC包含:/ path / to …
我试图理解为什么以下内容没有给我我认为(或想要:))应该返回的内容:
sed -r 's/^(.*?)(Some text)?(.*)$/\2/' list_of_values
Run Code Online (Sandbox Code Playgroud)
或 Perl:
perl -lpe 's/^(.*?)(Some text)?(.*)$/$2/' list_of_values
Run Code Online (Sandbox Code Playgroud)
所以我希望我的结果只是,Some text否则(意味着如果 中没有捕获任何内容$2)那么它应该是 EMPTY 。
我确实注意到,对于perl,如果位于行/字符串的开头,它确实可以工作(这让我感到困惑......)。Some text(还注意到删除^并$没有效果)
基本上,我试图获取此处讨论的选项grep会返回什么。只有我想要/需要在正则表达式中使用 sub/replace 。--only-matching
编辑(添加示例数据)
输入示例:
$ cat -n list_of_values
1 Black
2 Blue
3 Brown
4 Dial Color
5 Fabric
6 Leather and Some text after that ....
7 Pearl Color
8 Stainless Steel
9 White
10 …Run Code Online (Sandbox Code Playgroud) 试图理解为什么以下不起作用:
DB<1> $record = "some value"
DB<2> $record->{default} = $record;
DB<3> use Data::Dumper
Run Code Online (Sandbox Code Playgroud)
会认为Dumper应该显示与步骤10相同的结果:
DB<4> print Dumper $record
$VAR1 = 'some value';
DB<5> $temp = $record
DB<6> $record->{default} = $temp
Run Code Online (Sandbox Code Playgroud)
至少在这种情况下,会认为Dumper会在第10步显示结果:
DB<7> print Dumper $record
$VAR1 = 'some value';
Run Code Online (Sandbox Code Playgroud)
你真的需要强行吗?
DB<8> undef $record
DB<9> $record->{default} = $temp
DB<10> print Dumper $record
$VAR1 = {
'default' => 'some value'
};
Run Code Online (Sandbox Code Playgroud)
我怎么能理解/解释为什么Perl没有"得到"我的意思?