最近用到了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仍然继续

ANT---调用外部命令的一些坑的更多相关文章

  1. Perl调用外部命令的方式和区别

    主要的方式简述如下:1. system("command");使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码. 2. exec(" ...

  2. scala调用外部命令

     scala调用外部命令 1.  导入sys.process包 2. 调用方式:" 外部命令 " !     双引号内+外部命令+感叹号 例:     scala调用外部命令工作原 ...

  3. PHP调用外部命令

    ------------------------------------------------------------------ 一.PHP调用外部命令总结                     ...

  4. 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

    如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

  5. Perl调用外部命令(其他脚本、系统命令)的方法和区别

    1. `command`; 使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值.   2. open LIST "ls -l| ...

  6. JDK1.5新特性,基础类库篇,调用外部命令类(ProcessBuilder)用法

    一. 背景 ProcessBuilder类是用来创建操作系统进程的.与Runtime.exec相比,它提供了更加方便的方法以创建子进程. 每个ProcessBuilder实例管理着一个进程属性的集合. ...

  7. PHP中调用外部命令的方法

    在PHP中调用外部命令,可以用如下三种方法来实现: 方法一:用PHP提供的专门函数(四个): PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), she ...

  8. Python 调用外部命令

    python 可以使用 os 模块来调用外部的 Linux Shell 命令,常用的方法如下: os.system():结果输出在终端上,捕获不到os.popen() : 结果返回一个对象,即标准输出 ...

  9. linux sh 脚本调用外部命令

    参考:http://blog.csdn.net/lhb_blog/article/details/22083649 ------------------------------------------ ...

  10. ant调用shell命令(Ubuntu)

    ant中调用Makefile,使用shell中的make命令 <?xml version="1.0" encoding="utf-8" ?> < ...

随机推荐

  1. eclipse使用技巧的网站收集——转载(二)

    写代码离不开文本编辑器,看代码也离不开,iar和keil编辑和阅读简直一般般了,因此使用eclipse可以看看代码,提高效率.网上有几个博客的文章,这里收集一下,以备忘. 以下文章转载自:http:/ ...

  2. 天问之Linux内核中的不明白的地方

    1. Linux 0.11\linux\kernel\exit.c 文件中, 无论是send_sig()函数还是kill_session()函数中,凡是涉及到发送信号的地方,都是直接    (*p)- ...

  3. ACM-ICPC 2015 Shenyang Preliminary Contest B. Best Solver

    The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart. ...

  4. 下载linaro android 4.4.2 for panda4460

    $ export MANIFEST_REPO=git://android.git.linaro.org/platform/manifest.git$ export MANIFEST_BRANCH=li ...

  5. Android CTS - Cannot run program "aapt"/ Fail to run aapt on .../apk installed but AaptParser failed

    今天同事碰到cts的一些问题,跑到某个apk的时候,就提示如下错误: Cannot run program "aapt": error=2. No such file or dir ...

  6. Hadoop4.2HDFS测试报告之一

    1.1   测试方案 1.1.1 测试目标 为了验证本地文件系统和HDFS存储能力对比,将1G文件组存储进各个文件系统,记录存储任务消耗的时间. l   测试HDFS的高可用性和高稳定性 l   测试 ...

  7. Mantis安装与配置

    什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list). It is written in t ...

  8. Huawei比赛数据分析

    如何评价2018年华为软件精英挑战赛赛题? https://www.zhihu.com/question/268448695 1.时间与时间戳之间的转换 https://blog.csdn.net/g ...

  9. Leetcode39--->Combination Sum(在数组中找出和为target的组合)

    题目: 给定一个数组candidates和一个目标值target,求出数组中相加结果为target的数字组合: 举例: For example, given candidate set [2, 3, ...

  10. Leetcode31--->Next Permutation(数字的下一个排列)

    题目: 给定一个整数,存放在数组中,求出该整数的下一个排列(字典顺序):要求原地置换,且不能分配额外的内存 举例: 1,2,3 → 1,3,2:  3,2,1 → 1,2,3:  1,1,5 → 1, ...