【问题标题】:supplying command options to system binaries whose paths are stored in variables in perl向系统二进制文件提供命令选项,其路径存储在 perl 的变量中
【发布时间】: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);'

可以看出,我一直在尝试确定将二进制文件的路径存储在变量中的语法,然后使用选项对该二进制文件执行系统调用。我将不胜感激有关正确语法的启发。

【问题讨论】:

    标签: bash perl


    【解决方案1】:

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

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

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

    我仍然很想知道为什么在“/bin/ls”而不是“ls”周围需要引号,如问题开头所述。

    【讨论】:

      【解决方案2】:

      周围需要引号的原因:

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

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

      m/PATTERN/msixpogc

      /PATTERN/msixpogc

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

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

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

      【讨论】:

      • 谢谢,有道理。
      • 谢谢,我不知道use warnings; 的“-w”选项用于单行。不过,我总是将它包含在脚本中。
      • -w 是开启警告的旧方式,但仍受支持。 use warnings;(在 5.6 中引入)在脚本中是首选的,因为它是可控的并且更明确。
      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      相关资源
      最近更新 更多