2010-03-03 87 views
5

bash外壳上的Linux引号:EXEC ARGS(值)由Ant脚本

./mimic_cmd "startDaemon()" 

通讯蚂蚁代码:

<exec failonerror="true" executable="/bin/mimic_cmd"> 
    <arg value='"startDaemon()"' /> 
</exec> 
  1. 是否蚂蚁代码恰好在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. 

然而,1,而在Bash shell命令返回0

绷vmlauncher没有按蚂蚁的代码返回和退出代码没有帮助,路径都是正确的。

相同的蚂蚁代码适用于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. 

回答

8

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

不需要也不想要你的ANT XML属性(内双引号顺便说一句,因为它为格式良好的XML,您应该将它们写为&quot;而不是",但是这不会影响讨论),除非您的可执行文件期望它们。为以下任一(100%当量)的外壳命令线的对应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> 

...或者,为了说明的目的:

<!-- 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 shell发出命令(交互地或作为另一个脚本的一部分或编程方式通过execsh -c),并且只是为了让那个壳不会认为圆形包子()具有特殊含义。当shell反过来产生mimic_cmd时,它已经剥去了双引号(并且替换了反斜杠转义的序列等等 - 见how a *nix shell parses its command line),ANT不会通过shell运行你的命令,而是直接执行它,所以在这个案件mimic_cmd发现自己的手上有一堆双引号,它显然不知道如何处理。

你基本上必须把它看作是用XML转义和替换为<arg/>标签替换所有形式的shell引用和转义。

Windows的CMD.EXE是在这,unline * nix的外壳,它的最小解析(一般不关心在程序参数双引号)感special,留给了程序弄清楚你的意思引用。(这实际上是Windows'CreateProcess的一个硬性限制,其中does not have the notion of argv[],以每个程序为准,以它认为合适的方式解释lpCommandLine;有些会为您排除引号,但该行为是非常不一致的,例如问题echo "bla"CMD.EXE提示符下查看CMD.EXE的内置函数对引用的看法。)同样,对于您的情况,圆括号()对于CMD.EXE没有任何意义,所以即使在命令提示符处键入命令时也不需要它们。至于ANT,在Windows和* nix平台上,它通过CreateProcess而不是CMD.EXE来传递mimic_cmd,所以你不想引用任何东西。

+0

mimic_cmd是跨平台安装解决方案的shell可执行文件。我不参与开发它的内部团队,所以老实说,我不能说是否总是需要引号,但有些命令似乎需要它们,或者在括号之前必须有一个空格? 'mimic_cmd StartDaemon()'在ANT和命令行(不包括引号,空格)中不起作用 'mimic_cmd createNewWorkspace(blah)'不带引号根本不起作用; ''“mimic_cmd createNewWorkspace(blah)”'在Windows上运行,但不能运行在linux上,'mimic_cmd createNewWorkSpace(blah)'同时运行在...(括号之前的空格) – Michael 2010-03-04 00:24:33

+0

嗯......小心那些不带引号* nix,他们可能正在做一些背后的事情,你不希望......输入'/ bin/mimic_cmd“createNewWorkspace(blah)”'在* nix命令行上工作吗?如果是这样的话,那么在ANT中''exec failonerror =“true”executable =“/ bin/mimic_cmd”>“如果'blah'本身就是一个字符串,它会变得更有趣:'/ bin/mimic_cmd“createNewWorkspace(\”blah \“)”'或'/ bin/mimic_cmd'createNewWorkspace(“blah”)'' ,在ANT中,'... ...' – vladr 2010-03-04 00:48:27