为系统二进制文件提供命令选项,其路径存储在perl

时间:2017-01-09 08:56:41

标签: bash perl

我很难找到通过Perl执行系统二进制文件的正确语法。

以下按预期方式工作:

perl -e 'system(ls);'

除非在二进制文件路径周围提供引号,否则以下操作无效:

perl -e 'system(/bin/ls);'

鉴于我对documentation的理解,在这两种情况下,system的参数是没有shell metacharacters的单个标量,因此结果应该相同。此外,由于perl命令由单引号括起,因此可以排除shell插值作为问题。

可以通过各种方式向命令提供选项,使用其短名称或完整路径:

perl -e 'system("ls", "-l");'
perl -e 'my @args = ("ls","-l"); system(@args);'
perl -e 'my @args = ("/bin/ls","-l"); system(@args);'

但是,如果二进制路径存储在变量中,则选项会失败:

perl -e 'my $ls = `which ls`; system($ls, "-l");'
perl -e 'my $ls = `which ls`; system("$ls", "-l");'
perl -e 'my $ls = `which ls`; my @args = ($ls,"-l"); system(@args);'
perl -e 'my $ls = `which ls`; my @args = ("$ls","-l"); system(@args);'

如果省略选项,则可以接受在变量中存储二进制文件的路径:

perl -e 'my $ls = `which ls`; system($ls);'

另一方面,options可以与包含二进制名称的变量一起使用:

perl -e 'my $ls = "ls"; my @args = ($ls,"-l"); system(@args);'

可以看出,我一直在尝试确定将二进制路径存储在变量中的语法,然后使用选项执行对该二进制文件的系统调用。我希望对正确的语法有所了解。

2 个答案:

答案 0 :(得分:1)

好的,答案很简单就是which在二进制文件的路径上附加一个换行符,必须将其删除:

$ perl -e 'my $ls = `which ls`; chomp($ls); system("$ls", "-l");'

我不会删除帖子,而是将其留在此处,以便将来可能遇到相同问题的用户受益。

我仍然有兴趣知道为什么需要报价" / bin / ls"而不是" ls",正如问题开头所提到的那样。

答案 1 :(得分:1)

需要引用的原因是:

perl -e 'system(/bin/ls);'

是因为裸/被视为正则表达式的开头,默认为 match-operator m)。正如perlop所说:

米/ PATTERN / msixpogc

/ PATTERN / msixpogc

在字符串中搜索模式匹配,在标量上下文中,如果成功则返回true,如果失败则返回false。如果没有通过=〜或!〜运算符指定字符串,则搜索$ _字符串。

但是,我听到你问,为什么不发出警告?因为您没有设置警告:

perl -we 'system(/bin/ls);'
Use of uninitialized value $_ in pattern match (m//) at -e line 1.