[英]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
的链接)。 感谢ikegami和ThisSuitIsBlackNot对此发表评论。 特别是,重定向&>
不起作用,因为这是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系统上, sh
是bash
的链接,因此&>
起作用。 请注意, 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.