【发布时间】:2017-01-09 17:23:31
【问题描述】:
我很难找到通过 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);'
另一方面,选项可以与包含二进制名称的变量一起使用:
perl -e 'my $ls = "ls"; my @args = ($ls,"-l"); system(@args);'
可以看出,我一直在尝试确定将二进制文件的路径存储在变量中的语法,然后使用选项对该二进制文件执行系统调用。我将不胜感激有关正确语法的启发。
【问题讨论】: