巴什壳:
./mimic_cmd "startDaemon()"对应的Ant代码:
<exec failonerror="true" executable="/bin/mimic_cmd">
<arg value='"startDaemon()"' />
</exec>使用参数执行'/bin/mimic_cmd‘:exec '"startDaemon()"’exec‘可执行文件周围的字符和参数不是命令的一部分。Execute:Java13CommandLauncher:使用参数'/bin/mimic_cmd‘执行’'"startDaemon()"‘可执行文件和参数周围的’字符不是命令的一部分。
但是,Ant代码返回和退出代码为1,而Bash命令返回0。
切换vmlauncher没有帮助,而且路径都是正确的。
相同的Ant代码在windows上工作,其结果是调试输出:
执行带有参数的'C:\bin\mimic_cmd‘:exec '"startDaemon()"’exec‘可执行文件和参数周围的字符不是exec命令的一部分。执行:Java13CommandLauncher:使用参数执行'C:\bin\mimic_cmd‘:’‘startDaemon()’‘可执行文件和参数周围的’字符‘不是命令的一部分。
发布于 2010-03-03 23:32:27
你能告诉我们mimic_cmd是什么吗?(它是一个ELF可执行文件,它是一个脚本吗?如果是,它的内容是什么?)
您不需要也不希望ANT属性中包含双引号(顺便说一句,要使它是格式良好的XML,您应该将它们写成"而不是",但这与讨论无关),除非您的可执行文件期望它们。以下任何一个(100%等效的) shell命令行的对应ANT代码:
./mimic_cmd "startDaemon()"
./mimic_cmd 'startDaemon()'
./mimic_cmd startDaemon\(\)
./mimic_cmd startDaemon"()"
./mimic_cmd startDaemon'()'...actually是:
<exec failonerror="true" executable="/bin/mimic_cmd">
<arg value="startDaemon()" />
</exec> ...or,为说明性目的:
<!-- 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 of sh -c编程)发出命令的时候,并且只是为了让这个shell不认为圆形parens ()有特殊的含义。当shell反过来生成mimic_cmd时,它已经删除了双引号(以及替代反斜杠--转义序列等--参见nix shell解析其命令行。) ANT不通过shell运行命令,而是直接执行命令,因此在这种情况下,mimic_cmd发现自己手上有一堆双引号,显然它不知道如何处理。
本质上,您必须把它看作是用XML转义替换所有形式的shell、引用和转义,然后向下呼吸到<arg/>标记中。
Windows的CMD.EXE是特别,也就是说,unline *nix只进行最小的解析(并且通常不关心程序参数中的双引号),这就让程序来理解引用是什么意思。(这实际上是Windows‘CreateProcess argv[]的一个严格限制,让每个程序以它认为合适的方式对lpCommandLine进行整数处理;有些程序会为您去掉引号,但这种行为非常不一致,例如在CMD.EXE提示符上发布echo "bla",查看CMD.EXE的内置程序对引用的看法。)同样,在您的示例中,圆parens ()对CMD.EXE没有任何意义,所以即使在命令提示符下键入命令时也不需要它们。至于ANT,在Windows和*nix平台上一样,它通过CreateProcess而不是CMD.EXE跨越CreateProcess,所以您不想引用任何内容。
https://stackoverflow.com/questions/2375780
复制相似问题