zoukankan      html  css  js  c++  java
  • ANT---调用外部命令的一些坑

     

    最近用到了Ant,发现还是有许多功能是Ant没有提供相应Task支持,而操作系统提供了相应的系统命令。Ant说明书上说了,用<exec>可以调用系统命令,实际操作起来才发现陷阱可不少,一不小心就会掉下去。

    对于Windows平台,命令是:dir /o:-d

    对于Unix(包括Linux,下同)平台,命令是 ls –ltr

    陷阱1:调用谁?

    这在Ant文档中已经提到了,在Windows下,不能直接调用dir、del(因为没有这个程序!)等,必须通过cmd.exe来调用:

    <?xml version="1.0" ?>

    <project name="testExec" default="test">

         <target name="test">

                <exec executable="cmd.exe">

                       <arg line="/c dir"/>

                </exec>

         </target>

    </project>

    对于Unix,则可以直接调用ls:

    <?xml version="1.0" ?>

    <project name="testExec" default="test">

         <target name="test">

                <exec executable="ls"/>

         </target>

    </project>

    也可以指明由Shell调用

    <?xml version="1.0" ?>

    <project name="testExec" default="test">

         <target name="test">

                <exec executable="/bin/sh">

                       <arg line="-c ls" />

                </exec>

         </target>

    </project>

    我觉得后者要好一些,否则无法保证调用的是否系统命令,因为只要Path环境变量指明的路径下有一个同名的程序,都可能被调用到。

    通过Shell调用,Windows必须加 /c,Unix则是加 –c

    陷阱2:arg line, arg value 还有引号

    假如我们扩充Windows平台下的例子,满足按修改时间倒序的要求:

    <?xml version="1.0" ?>

    <project name="testExec" default="test">

         <target name="test">

                <exec executable="cmd.exe">

                       <arg line="/c dir /o-d"/>

                </exec>

         </target>

    </project>

    成功。换Unix了:

    <?xml version="1.0" ?>

    <project name="testExec" default="test">

         <target name="test">

                <exec executable="/bin/sh">

                       <arg line="-c ls -ltr" />

                </exec>

         </target>

    </project>

    对不起,失败:java.lang.IOException。

    之所以这样,是因为<arg line>把每个空格分隔的字符串作为参数传给调用程序,但是对于”/bin/sh”来说,”ls –ltr”应该是一个参数而不是两个。解决办法有两个:

    加引号:

    <?xml version="1.0" ?>

    <project name="testExec" default="test">

         <target name="test">

                <exec executable="/bin/sh">

                       <arg line="-c 'ls –ltr'" />

                </exec>

         </target>

    </project>

    或者使用<arg value>:

    <?xml version="1.0" ?>

    <project name="testExec" default="test">

         <target name="test">

                <exec executable="/bin/sh">

                       <arg value="-c" />

    <arg value="ls -ltr" />

                </exec>

         </target>

    </project>

    陷阱3:阻塞(block

    不论是Windows还是Unix,调用一个程序后都必须等到该操作结束才能继续作下面的操作。如果你想调用一个程序的同时还做其它的工作,必须使用<parallel>:

    <?xml version="1.0" ?>

    <project name="testExec" default="test">

         <target name="test">

                <exec executable="notepad.exe"/>

                <echo message="You must close notepad first!"/>

               

                <parallel>

                       <exec executable="notepad.exe"/>

                       <echo message="You do not need to close notepad."/>

                <parallel>

         </target>

    </project>

    需要注意的属性:

    dir               指明程序执行的路径。对搜索程序也有影响

    os                指明执行的平台

    failonerror    缺省为false,即该命令执行了但是失败了,build仍然继续

  • 相关阅读:
    命令拷屏之网络工具
    PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
    Java实现 计蒜客 1251 仙岛求药
    Java实现 计蒜客 1251 仙岛求药
    Java实现 计蒜客 1251 仙岛求药
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 蓝桥杯 算法训练 字符串合并
    Java实现 LeetCode 143 重排链表
    Java实现 LeetCode 143 重排链表
  • 原文地址:https://www.cnblogs.com/anyehome/p/8477361.html
Copyright © 2011-2022 走看看