首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Ant脚本中linux上引号的EXEC args (value)

带有Ant脚本中linux上引号的EXEC args (value)
EN

Stack Overflow用户
提问于 2010-03-03 23:18:03
回答 1查看 17.6K关注 0票数 5

巴什壳:

代码语言:javascript
复制
./mimic_cmd "startDaemon()"

对应的Ant代码:

代码语言:javascript
复制
 <exec failonerror="true" executable="/bin/mimic_cmd">
    <arg value='"startDaemon()"' />
 </exec>
  1. Ant代码是否准确地表示bash上的上述命令?根据调试信息,它看起来如下:

使用参数执行'/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()’‘可执行文件和参数周围的’字符‘不是命令的一部分。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-03 23:32:27

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

不需要也不希望ANT属性中包含双引号(顺便说一句,要使它是格式良好的XML,您应该将它们写成&quot;而不是",但这与讨论无关),除非您的可执行文件期望它们。以下任何一个(100%等效的) shell命令行的对应ANT代码:

代码语言:javascript
复制
   ./mimic_cmd "startDaemon()"
   ./mimic_cmd 'startDaemon()'
   ./mimic_cmd startDaemon\(\)
   ./mimic_cmd startDaemon"()"
   ./mimic_cmd startDaemon'()'

...actually是:

代码语言:javascript
复制
   <exec failonerror="true" executable="/bin/mimic_cmd"> 
      <arg value="startDaemon()" /> 
   </exec> 

...or,为说明性目的:

代码语言:javascript
复制
   <!-- 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 (交互地发出命令,或者作为另一个脚本的一部分,或者通过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,所以您不想引用任何内容。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2375780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档