Можете ли вы сказать нам, что такое mimic_cmd
? (Это исполняемый файл ELF, это скрипт - и если да, то каково его содержимое?)
Вам не нужны и не нужны двойные кавычки внутри ваших атрибутов ANT XML (кстати, чтобы это был правильно сформированный XML, вы должны были записать их как "
, а не "
, но это ничего не меняет в отношении этого обсуждения), если ваш исполняемый файл не ожидает их. Соответствующий код 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 "startDaemon()"" />
</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
, так что вы не хотите ничего цитировать.