Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linux上带引号的EXEC args(value)来自Ant脚本_Ant - Fatal编程技术网

linux上带引号的EXEC args(value)来自Ant脚本

linux上带引号的EXEC args(value)来自Ant脚本,ant,Ant,bash shell: ./mimic_cmd "startDaemon()" 对应的蚂蚁代码: <exec failonerror="true" executable="/bin/mimic_cmd"> <arg value='"startDaemon()"' /> </exec> 但是,Ant代码返回和退出代码1,而Bash shell命令返回0 切换vmlauncher没有帮助,路径都是正确的 相同的Ant代码在windows上工作,并产

bash shell:

./mimic_cmd "startDaemon()"
对应的蚂蚁代码:

 <exec failonerror="true" executable="/bin/mimic_cmd">
    <arg value='"startDaemon()"' />
 </exec>
但是,Ant代码返回和退出代码1,而Bash shell命令返回0

切换vmlauncher没有帮助,路径都是正确的

相同的Ant代码在windows上工作,并产生调试输出:


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

您不需要也不希望在ANT XML属性中包含双引号(顺便说一句,要使其成为格式良好的XML,您应该将它们写成
而不是
,但这不会改变与本讨论相关的内容),除非您的可执行文件需要它们。以下任一(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> 

)ANT不通过shell运行您的命令,而是直接执行它,因此在本例中,
mimic\u cmd
发现自己手上有一堆双引号,它显然不知道如何处理


基本上,您必须将其视为用XML转义替换所有形式的shell引用和转义,并将其转换为
,从这个意义上讲,unline*nix shell只执行最小的解析(并且通常不关心程序参数中的双引号),让程序来理解引用的含义。(这实际上是Windows的一个硬限制,让每个程序以其认为合适的方式解释
lpCommandLine
;有些程序会为您删除引号,但这种行为极不一致,例如发出
echo“bla”
CMD.EXE
提示符上查看
CMD.EXE
的内置函数如何考虑引用。)同样,在您的情况下,圆形参数
()
CMD.EXE
没有任何意义,因此即使在命令提示符下键入命令,您也不需要它们。至于ANT,在Windows和*nix平台上,它通过
CreateProcess
not
cmd.EXE
来spwans
mimic\u cmd
,所以您不想引用任何东西。

mimic\u cmd是跨平台安装解决方案的shell可执行文件。我不在开发它的内部团队工作,所以老实说,我不能说是否总是需要引号,但有些命令似乎需要引号,或者括号前必须有空格?”Missic_cmd StartDaemon()'在ANT和命令行中都能工作(没有引号,没有空格)'Missic_cmd createNewWorkspace(blah)'没有引号根本不能工作;'“mimic_cmd createNewWorkspace(blah)”适用于Windows,但不适用于linux,“mimic_cmd createNewWorkspace(blah)”适用于Windows和linux。。。(括号前空格)嗯。。。小心那些在*尼克斯上没有引号的圆括号,他们可能在你背后做一些你意想不到的事情。。。在*nix命令行中键入
/bin/mimic_cmd“createNewWorkspace(blah)”
是否有效?如果是这样,
应该在ANT中也能正常工作。如果
blah
本身就是一个字符串,它会变得更有趣:
/bin/mimic\u cmd“createNewWorkspace(\'blah\”)
/bin/mimic\u cmd“createNewWorkspace(“blah”)”
在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> 
   <!-- 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>