EXEC args(value)带有来自Ant脚本的linux上的引号

时间:2010-03-03 23:18:04

标签: ant

bash shell:

./mimic_cmd "startDaemon()"

对应的Ant代码:

 <exec failonerror="true" executable="/bin/mimic_cmd">
    <arg value='"startDaemon()"' />
 </exec>
  1. Ant代码是否完全代表bash shell中的上述命令?基于调试信息,它看起来像:
  2.  [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.
    

    但是,当Bash shell命令返回0时,Ant代码返回并退出代码1。

    切换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 个答案:

答案 0 :(得分:7)

您能告诉我们mimic_cmd是什么吗? (它是一个ELF可执行文件,它是一个脚本 - 如果是,它的内容是什么?)

在ANT XML属性中不需要也不想要双引号(顺便说一下,为了使它成为格式良好的XML,你应该把它们写成&quot;而不是{除非你的可执行文件期望它们,否则{1}},但这对于此讨论没有任何改变。以下任一(100%等效)shell命令行的相应ANT代码:

"

......实际上是:

   ./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> 

为什么会如此,以便解释;足以说明,在您的特定情况下,您必须使用双引号的唯一时间是最终通过* nix shell发布命令(交互式或作为另一个脚本的一部分或以编程方式通过{{1 {} {}}}} {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}当shell反过来生成 <!-- 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> 时,它已经剥离了双引号(并替换了反斜杠转义序列等 - 请参阅how a *nix shell parses its command line)ANT不通过shell运行命令但是而是直接执行它,所以在这种情况下exec发现自己手上有一堆双引号,显然它不知道如何处理。

你必须将它视为用XML转义替换所有形式的shell引用和转义,并将其转换为sh -c标记。

Windows ()special,意思是,unline * nix shell,它执行最小的解析(并且通常不关心程序参数中的双引号),将它留给程序通过引用来弄清楚你的意思。 (这实际上是Windows CreateProcess does not have the notion of argv[]的一个严格限制,让每个程序以其认为合适的方式对mimic_cmd进行解释;有些将删除引用你,但是这种行为非常不一致,例如在mimic_cmd提示符上发出<arg/>来查看CMD.EXE的内部组件对引用的看法。)同样,在你的情况下,圆形的parens {{ 1}}对lpCommandLine没有意义,所以即使在命令提示符下输入命令也不需要它们。对于ANT,在Windows上和* nix平台上一样,它通过echo "bla"而不是CMD.EXECMD.EXE,所以你真的不想引用任何内容。