小编lzc*_*lzc的帖子

Shell函数是否在子shell中运行

我试图解决一个问题,在我看来,你无法将开放的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还是别的什么行为,如果barbaz从子shell执行.

如果我能以某种方式弄清楚如何将db2 open连接传递给subshel​​l,那我会很高兴.

否则,这些shell函数在我看来它们在子shell中运行.有办法吗?

bash subshell

7
推荐指数
1
解决办法
4362
查看次数

PERLLIB成功注入@INC数组,但不适用于非交互式外壳

我的目标是在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 …

unix ssh perl environment-variables

2
推荐指数
1
解决办法
220
查看次数

仅将正则表达式替换为捕获的组

我试图理解为什么以下内容没有给我我认为(或想要:))应该返回的内容:

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)

regex perl sed regex-group

0
推荐指数
1
解决办法
1729
查看次数

-e文件测试和存在函数之间是否存在关系?

阅读-e文件测试的文档,它说:

-e文件存在

有什么东西,我缺少任何关系-eexists功能之间的关系?

perl

-1
推荐指数
1
解决办法
51
查看次数

将标量变量及其值转换为hash ref变量的值

试图理解为什么以下不起作用:

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没有"得到"我的意思?

perl

-2
推荐指数
2
解决办法
781
查看次数

标签 统计

perl ×4

bash ×1

environment-variables ×1

regex ×1

regex-group ×1

sed ×1

ssh ×1

subshell ×1

unix ×1