Strawberry perl: нужно использовать амперсанд в команде обратной кавычки в качестве параметра, а не в качестве фона

Я пытаюсь запустить почтовую команду «wget» из Perl-скрипта. Я использую клубничный perl на машине с Windows 7. Параметр 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, я получаю следующие ошибки:

«Поле2» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.

«Поле3» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл.

Я поместил полную часть «post» команды, которая находится в одинарных кавычках, внутри двойных кавычек, потому что я обнаружил, что это как предложение, указывающее, что что-либо внутри двойных кавычек не интерпретируется. Похоже, это сработало с точки зрения выполняемой команды, не рассматривающей «&» как символ «запуска в фоновом режиме». Но результирующая выполняемая команда не делает то, что я хочу. Это означает, что POST не публикуется из сценария perl, как это происходит, когда я запускаю команду, как указано выше, из командной строки. Я пытался экранировать символ '&', используя одиночный '\' и двойной '\', так как я знаю, что иногда может возникнуть необходимость в многократном экранировании по мере передачи строки. Я даже пробовал это с '\\'. Но, похоже, это ни на что не повлияло.

Я хотел бы использовать обратную галочку, чтобы я мог проанализировать вывод команды для дальнейшего принятия решения позже в сценарии. Итак, я думаю, что мне нужна обратная кавычка вместо «system ()».

Заранее спасибо за любую помощь в том, как мне нужно избежать или процитировать это, чтобы получить правильную обработку. Или, если есть способ увидеть, что делается внутри обратной кавычки после того, как она была интерпретирована и передана оболочке для выполнения. Если бы я знал это, я думаю, я мог бы лучше сказать, что я делаю неправильно.

С уважением, sjmyst


person sjmyst    schedule 12.01.2015    source источник


Ответы (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» после того, как оболочка из обратной галочки интерпретирует аргументы POST и передаст их «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

person sjmyst    schedule 13.01.2015