你能告诉我们mimic_cmd是什么吗? (它是一个ELF可执行文件,它是一个脚本 – 如果是,它的内容是什么?)
你不需要也不想在你的ANT XML属性中使用双引号(顺便说一句,因为它是格式良好的XML,你应该把它们写成& quot; not“,但这对于这个讨论没有任何改变)除非您的可执行文件需要它们.以下任一(100%等效)shell命令行的相应ANT代码:
./mimic_cmd "startDaemon()"
./mimic_cmd 'startDaemon()'
./mimic_cmd startDaemon\(\)
./mimic_cmd startDaemon"()"
./mimic_cmd startDaemon'()'
……实际上是:
……或者,为说明目的:
为什么会如此呢?足以说明,在你的具体情况下,你必须使用双引号的唯一时间是最终通过* nix shell发布命令(交互式或作为另一个脚本的一部分或通过执行sh的编程方式) -c),只是为了让shell不要认为圆形parens()具有特殊含义.当shell反过来产生mimic_cmd时,它已经剥离了双引号(并替换了反斜杠转义序列等 – 见how a *nix shell parses its command line)ANT不通过shell运行你的命令而是直接执行它,所以在这里case mimic_cmd发现自己手上有一堆双引号,显然它不知道如何处理.
您基本上必须将其视为替换所有形式的shell引用和转义,并使用XML转义并将其转换为< arg />标签.
Windows的CMD.EXE是special,意思是,unline * nix shell,它执行最小的解析(通常不关心程序参数中的双引号),让程序通过引用来弄清楚你的意思. (这实际上是Windows’CreateProcess does not have the notion of argv[]的一个严格限制,让每个程序都能以它认为合适的方式解释lpCommandLine;有些会为你删除引号,但这种行为极不一致,例如问题回声CMD.EXE上的“bla”提示,看看CMD.EXE内置的内容是如何考虑引用的.)同样,在你的情况下,圆形parens()对CMD.EXE没有任何意义,所以你甚至在输入命令时也不需要它们在命令提示符下.对于ANT,在Windows上和* nix平台上一样,它通过CreateProcess而不是CMD.EXE来扫描mimic_cmd,所以你真的不想引用任何东西.