linux上带引号的EXEC args(value)来自Ant脚本
bash shell: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上工作,并产
./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
notcmd.EXE
来spwansmimic\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 "startDaemon()"" />
</exec>