我很难找到通过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);'
可以看出,我一直在尝试确定将二进制路径存储在变量中的语法,然后使用选项执行对该二进制文件的系统调用。我希望对正确的语法有所了解。
答案 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.