zoukankan      html  css  js  c++  java
  • 从Ant调用系统命令或外部程序 half

     

    最近用到了Ant,发现还是有许多功能是Ant没有提供相应Task支持,而操作系统提供了相应的系统命令。Ant说明书上说了,用<exec>可以调用系统命令,实际操作起来才发现陷阱可不少,一不小心就会掉下去。下面以按日期倒序列举当前目录下文件为例说明。注意我使用的是Ant 1.5.4

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

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

     

    陷阱1:调用谁?

    这在Ant文档中已经提到了,在Windows下,不能直接调用dirdel(因为没有这个程序!)等,必须通过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必须加 /cUnix则是加 –c

     

    陷阱2arg 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仍然继续

    转自:http://www.cnblogs.com/halfacre/admin/EditPosts.aspx?opt=1

  • 相关阅读:
    线程安全-003-对象锁的同步和异步
    线程安全-002-多个线程多把锁&类锁
    线程安全-001
    FastDFS单节点安装
    Nginx+Keepalived 实现高可用
    linux下配置nginx负载均衡例子
    linux下配置nginx反向代理例子
    Linux命令
    nginx配置文件 nginx.conf 说明
    CentOS安装Nginx 以及日志管理
  • 原文地址:https://www.cnblogs.com/halfacre/p/2758865.html
Copyright © 2011-2022 走看看