我正在尝试使用ant来运行bash脚本。
我发现exec指令是作业的工具
我创建了一个bash脚本test.sh 在我的蚂蚁目标中,我补充说:
<project basedir=".">
<property name="temp.deployment.dir" value="temp_deployment_dir"/>
<property name="temp.dir" value="temp_upload_dir"/>
<property name="src.dir" value="www"/>
<property name="js.dir" value="${src.dir}/public/js"/>
<property name="css.dir" value="${src.dir}/public/css"/>
<property name="img.dir" value="${src.dir}/public/images/"/>
<target name="clean">
<delete dir="${temp.dir}"/>
</target>
<target name="update-statics">
<mkdir dir="${temp.dir}"/>
<!--TODO: add statics in -->
</target>
<target name="deploy">
<mkdir dir="${$temp.deployment.dir}"/>
<copy todir="${temp.deployment.dir}">
<fileset dir="${src.dir}"/>
</copy>
<exec executable="bash" newenvironment="false" dir=".">
<arg value="cmd_update.sh"/>
</exec>
</target>
</project>
当我运行它时,我的构建成功,但test.sh永远不会运行。
我用谷歌搜索并搜索了我可能做错的事情,但因为没有错误我无法调试它。有没有人知道exec指令的正确用法,或者有什么我明显做错了。从我所知道的,我所做的与以往我发现的exec的其他例子一样。
答案 0 :(得分:4)
如果Bash脚本中有shebang,并且您的脚本是可执行的,则不需要包含bash
作为命令。 (我当然是假设Linux,Unix或Mac)。
<exec executable="${path.to.command}/cmd_update.sh"
failonerror="true"
osfamily="unix"/>
始终将failonerror
设置为true并始终设置osfamily
。
您可能需要设置其他内容,例如存储 STDOUT 和 STDERR 的属性。您还可以通过<arg value>
子任务传递参数。
我不会使用searchpath
参数,因为这可能是一个安全漏洞。
答案 1 :(得分:1)
首先要做的事情 - 当我看到一个高管时,我常常畏缩,这通常是有点臭的。 您希望在使用exec时将failonerror设置为“true”,并确保您的脚本在适当的情况下使用正确的返回代码退出。
你也不需要调用bash,你可以直接调用脚本 - 确保它是可执行的。
ant -v的输出是相关的。
答案 2 :(得分:1)
尝试:
<exec executable="**/bin/**bash" newenvironment="false" dir=".">
<arg value="cmd_update.sh"/>
</exec>