【问题标题】:Strawberry perl: need to use ampersand in a backtick command as a parameter, not as backgroundStrawberry perl:需要在反引号命令中使用&符号作为参数,而不是作为背景
【发布时间】:2015-01-12 08:57:32
【问题描述】:

我正在尝试从 perl 脚本中运行“wget”发布命令。我在 Windows 7 机器上使用草莓 perl。 post 参数包括与符号 (&) 字符,当我在反引号内运行 wget 时,与符号被视为命令的结尾,就好像我希望在与符号之前的所有内容在后台运行一样。我已经尝试了几种方法来尝试正确地逃避 & 符号。但是,我的想法已经用完了。

所以,我尝试运行的命令类似于:

$wget = "/c/workarea/wget/bin/wget";
$value1 = 1;
$groupName = "group1";
$output = `$wget --post-data 'Field1=${value1}&Field2=Val2&Field3=${groupName}' "http://localhost/LocalPage"`;

如果我从 bash 命令行运行命令,如下所示,它可以正常工作:

/c/workarea/wget/bin/wget --post-data 'Field1=1&Field2=Val2&Field3=group1' "http://localhost/LocalPage"

但是,当我在 perl 脚本中运行它时,会出现如下错误:

'Field2' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

'Field3' 未被识别为内部或外部命令, 可运行的程序或批处理文件。

我已将单引号中的命令的完整“post”部分放在双引号内,因为我发现这是一个建议,表明双引号内的任何内容都不会被解释。就正在执行的命令而言,这似乎有效,而不是将“&”视为“在后台运行”字符。但是,正在执行的结果命令并没有做我想要做的事情。这意味着 POST 不像我从命令行运行上述命令时那样从 perl 脚本发布。我尝试使用单个“\”和双“\”来转义“&”字符,因为我知道有时在传递字符串时可能需要多次转义。我什至用'\\'尝试过。但是,这似乎没有任何影响。

我想使用反引号,这样我就可以解析命令的输出,以便稍后在脚本中做出进一步的决策。所以,我认为我需要反引号而不是 'system()'。

提前感谢您对我需要如何逃脱或引用此内容以获得正确处理的任何帮助。或者,如果有一种方法可以在反引号被解释并传递给要执行的 shell 之后查看正在尝试的内容。如果我知道这一点,我想我可能能够更好地分辨出我做错了什么。

问候, sjmyst

【问题讨论】:

    标签: escaping ampersand strawberry-perl backticks


    【解决方案1】:

    好吧,我想出了如何通过编写脚本来输出参数来解决这个问题。所以,我所做的是编写以下脚本并将其命名为 test.pl:

     #!/usr/bin/env perl.exe
    
     print "ENTERING test.pl...\n";
    
     $i = 0;
     foreach my $arg (@ARGV) {
       print "i = $i\n";
       print "ARGV[$i] = $ARGV[$i]\n";
       $i = $i + 1;
     }
    

    然后,我没有使用上述参数调用“wget”,而是调用了 test.pl,将我一直传递给“wget”的参数传递给了“wget”。然后,我能够看到在反引号的 shell 解释 POST 参数并将它们传递给“wget”之后,“wget”会看到什么。我可能应该在发布之前弄清楚这一点。希望这可以帮助像我这样的新手解决这些逃避问题。所以,是这样的:

     $wget = "/c/workarea/wget/bin/wget";
     $value1 = 1;
     $groupName = "group1";
     # Wasn't working
     #$output = `$wget --post-data 'Field1=${value1}&Field2=Val2&Field3=${groupName}' "http://localhost/LocalPage"`;
     # Eventually got working by seeing what was passed into test.pl
     $output = `test.pl --post-data "Field1=${value1}&Field2=Val2&Field3=${groupName}" \"http://localhost/LocalPage\"`;
    

    底线是我只需要在 POST 参数周围加上双引号。所以,我只包含了双引号并完全删除了单引号。这会将字符串按原样传递给“wget”,作为一个参数,而反引号外壳将“&”视为“在后台运行”字符。

    问候,

    sjmyst

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2018-10-04
      • 2015-05-29
      • 2011-03-23
      • 1970-01-01
      • 2011-01-03
      相关资源
      最近更新 更多