繁体   English   中英

从perl执行if else shell命令

[英]Executing an if else shell command from perl

我以前从未遇到过这种情况,因此可以使用一些帮助。 我试图从shell命令但在perl中发出if / else语句。 我尝试了系统和执行,但没有成功。 这是代码示例

if ($os eq 'Ubuntu'){
    system('if ! dpkg -l curl &> /dev/null; then apt-get install curl -y; fi');
    foreach my $mod (keys %deb){
        eval "use $mod";
        if($@){
            system("apt-get install $deb{$mod} -y");
            eval "use $mod";
        }
    }
}

如果我运行命令的if ! dpkg -l curl &> /dev/null; then apt-get install curl -y; fi if ! dpkg -l curl &> /dev/null; then apt-get install curl -y; fi if ! dpkg -l curl &> /dev/null; then apt-get install curl -y; fi在shell中工作正常,但从perl执行它会跳过if部分,然后继续进行安装。

if工作完美。

$ perl -e'system("if ! true ; then echo ok ; fi")'

$ perl -e'system("if ! false ; then echo ok ; fi")'
ok

不过有一个问题。 您发布的是一个bash命令,但是system(EXPR)system('/bin/sh', '-c', EXPR)缩写。 只需更换

system(EXPR)

system('/bin/bash', '-c', EXPR)

应该可以。

您可以避免使用if语法的细节,也可以使用||对其进行简化。 而不是否定。 在命令行上尝试

perl -we 'system("rpm -q NO_PACK &> /dev/null || echo \"install package\"")'

我现在只能在RHEL上测试rpm 但是,在RHEL上,我也发现它也可以正常工作

perl -we 'system("if ! rpm -q NO >& /dev/null ; then echo install; fi")'

它是命令中的语法,与system调用的shell冲突,在Ubuntu上是dash (它本身是sh的链接)。 感谢ikegamiThisSuitIsBlackNot对此发表评论。 特别是,重定向&>不起作用,因为这是bash的特有功能。 然后,您可以更改为通用> /dev/null 2>&1 ,它将STDOUT流发送到/dev/null并将STDERR流(2)重定向到STDOUT (1)所在的相同位置

system('dpkg -l curl > /dev/null 2>&1 || apt-get install curl -y');

在RHEL系统上, shbash的链接,因此&>起作用。 请注意, 2&>1重定向也可以。 但是,我认为更好的解决方案是指定要使用的外壳。

system通过在列表中提供参数来允许调用外壳程序。 然后,作为第一个参数给出的程序将直接运行,而不会触发外壳,并将列表的其余部分传递给它。 这是使正确的外壳程序运行命令的方法,因为您可以将该外壳程序指定为列表中的第一个参数。 池上的答案就表明了这一点。

这个问题似乎有点问题,所以我想出另一种方法来解决它。 这就是我最终所做的,这给了我相同的最终结果

if ($os eq 'Ubuntu'){
    my $check = `dpkg --get-selections | grep "^curl *" | awk '{print \$1}'`;
    if(!$check){ system('apt-get install curl -y > /dev/null'); }
        foreach my $mod (keys %deb){
            eval "use $mod";
            if($@){
            system("apt-get install $deb{$mod} -y");
            eval "use $mod";
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM