EXEC args (значение) с кавычками на linux из скрипта Ant - PullRequest
5 голосов
/ 04 марта 2010

оболочка bash:

./mimic_cmd "startDaemon()"

Соответствующий код Ant:

 <exec failonerror="true" executable="/bin/mimic_cmd">
    <arg value='"startDaemon()"' />
 </exec>
  1. Является ли код Ant точно представленной выше командой в оболочке bash? На основании отладочной информации это выглядит так:
 [exec] Executing '/bin/mimic_cmd' with arguments:
 [exec] '"startDaemon()"'
 [exec] 
 [exec] The ' characters around the executable and arguments are
 [exec] not part of the command.
 Execute:Java13CommandLauncher: Executing '/bin/mimic_cmd' with arguments:
 '"startDaemon()"'
 The ' characters around the executable and arguments are not part of the command.

Однако код Ant возвращает и код выхода 1, а команда оболочки Bash возвращает 0.

Переключение vmlauncher не помогает, и все пути верны.

Тот же самый код Ant работает в Windows с полученным отладочным выводом:

 [exec] Executing 'C:\bin\mimic_cmd' with arguments:
 [exec] '"startDaemon()"'
 [exec] 
 [exec] The ' characters around the executable and arguments are
 [exec] not part of the command.
 Execute:Java13CommandLauncher: Executing 'C:\bin\mimic_cmd' with arguments:
 '"startDaemon()"'
 The ' characters around the executable and arguments are not part of the command.

1 Ответ

7 голосов
/ 04 марта 2010

Можете ли вы сказать нам, что такое mimic_cmd? (Это исполняемый файл ELF, это скрипт - и если да, то каково его содержимое?)

Вам не нужны и не нужны двойные кавычки внутри ваших атрибутов ANT XML (кстати, чтобы это был правильно сформированный XML, вы должны были записать их как &quot;, а не ", но это ничего не меняет в отношении этого обсуждения), если ваш исполняемый файл не ожидает их. Соответствующий код ANT для любой из следующих (эквивалент 100%) командных строк оболочки:

   ./mimic_cmd "startDaemon()"
   ./mimic_cmd 'startDaemon()'
   ./mimic_cmd startDaemon\(\)
   ./mimic_cmd startDaemon"()"
   ./mimic_cmd startDaemon'()'

... на самом деле это:

   <exec failonerror="true" executable="/bin/mimic_cmd"> 
      <arg value="startDaemon()" /> 
   </exec> 

... или, для наглядности:

   <!-- spawn a shell with your original command line -->
   <exec failonerror="true" executable="/bin/sh"> 
      <arg value="-c" /> 
      <arg value="/bin/mimic_cmd &quot;startDaemon()&quot;" /> 
   </exec> 

Почему это так логично объяснить; Достаточно сказать, что в вашем конкретном случае единственный раз, когда вам придется использовать двойные кавычки, это когда вы в конечном итоге выполните команду через оболочку * nix (либо интерактивно, либо как часть другого скрипта, либо программно через exec). sh -c), и только для того, чтобы эта оболочка не думала, что круглые скобки () имеют особое значение. К тому времени, когда оболочка, в свою очередь, порождает mimic_cmd, она уже удалила бы двойные кавычки (и заменила экранированные обратной косой чертой последовательности и т. Д. - см. , как оболочка * nix анализирует свою командную строку ), что делает ANT не запускайте команду через оболочку, а выполняйте ее напрямую, поэтому в этом случае mimic_cmd оказывается с кучей двойных кавычек на руке, с которыми она, очевидно, не знает, как обращаться.

По сути, вы должны думать об этом, как о замене всех форм цитирования и экранирования оболочки на XML, экранирующих и разбивающихся на <arg/> теги.

Windows 'CMD.EXE является особенным в том смысле, что, unline * nix shell, он выполняет минимальный анализ (и, как правило, не заботится о двойных кавычках в аргументах программы), оставляя его на усмотрение программы чтобы понять, что вы имели в виду, цитируя. (На самом деле это жесткое ограничение Windows * CreateProcess, которое не имеет понятия argv[], поэтому каждая программа может интерпретировать lpCommandLine любым способом. он сочтет нужным, некоторые избавятся от кавычек для вас, но это поведение крайне противоречиво, например, введите echo "bla" в подсказке CMD.EXE, чтобы увидеть, что встроенные в CMD.EXE думают о цитировании.) Опять же, в вашем case круглые скобки () не имеют значения для CMD.EXE, поэтому они вам не нужны даже при вводе команды в командной строке. Что касается ANT, в Windows, как и на * nix платформах, он включает mimic_cmd через CreateProcess, а не CMD.EXE, так что вы не хотите ничего цитировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...