bash shell:
./mimic_cmd "startDaemon()"
对应的Ant代码:
<exec failonerror="true" executable="/bin/mimic_cmd">
<arg value='"startDaemon()"' />
</exec>
[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.
答案 0 :(得分:7)
您能告诉我们mimic_cmd
是什么吗? (它是一个ELF可执行文件,它是一个脚本 - 如果是,它的内容是什么?)
你在ANT XML属性中不需要也不想要双引号(顺便说一下,为了使它成为格式良好的XML,你应该把它们写成"
而不是{除非你的可执行文件期望它们,否则{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 "startDaemon()"" />
</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.EXE
来CMD.EXE
,所以你真的不想引用任何内容。