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仍然继续
ANT---调用外部命令的一些坑的更多相关文章
- Perl调用外部命令的方式和区别
主要的方式简述如下:1. system("command");使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码. 2. exec(" ...
- scala调用外部命令
scala调用外部命令 1. 导入sys.process包 2. 调用方式:" 外部命令 " ! 双引号内+外部命令+感叹号 例: scala调用外部命令工作原 ...
- PHP调用外部命令
------------------------------------------------------------------ 一.PHP调用外部命令总结 ...
- 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)
如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...
- Perl调用外部命令(其他脚本、系统命令)的方法和区别
1. `command`; 使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车.反引号中的变量在编译时会被内插为其值. 2. open LIST "ls -l| ...
- JDK1.5新特性,基础类库篇,调用外部命令类(ProcessBuilder)用法
一. 背景 ProcessBuilder类是用来创建操作系统进程的.与Runtime.exec相比,它提供了更加方便的方法以创建子进程. 每个ProcessBuilder实例管理着一个进程属性的集合. ...
- PHP中调用外部命令的方法
在PHP中调用外部命令,可以用如下三种方法来实现: 方法一:用PHP提供的专门函数(四个): PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), she ...
- Python 调用外部命令
python 可以使用 os 模块来调用外部的 Linux Shell 命令,常用的方法如下: os.system():结果输出在终端上,捕获不到os.popen() : 结果返回一个对象,即标准输出 ...
- linux sh 脚本调用外部命令
参考:http://blog.csdn.net/lhb_blog/article/details/22083649 ------------------------------------------ ...
- ant调用shell命令(Ubuntu)
ant中调用Makefile,使用shell中的make命令 <?xml version="1.0" encoding="utf-8" ?> < ...
随机推荐
- IDEA常用快捷键(不全)
这里使用的是默认的idea快捷键,如果修改了keymap为其他,那么不适用. 1.格式化代码:Ctrl+Alt+L(可能与QQ的冲突,建议QQ只保留方便的截图,皮) 2.在当前行最后添加分号,或自动补 ...
- Java观察者模式(Observer)
一.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.主要应用在java的AWT事件机制 ...
- dict 字典的常用操作
#dict 字典的常用操作: id_db.get() #获取 id_db.update() #更新(覆盖)字典 id_db.values() #打印字典里所有的values id_db.keys() ...
- TTL与COMS的区别
1.电平的上限和下限定义不一样,CMOS具有更大的抗噪区域. 同是5伏供电的话,ttl一般是1.7V和3.5V的样子,CMOS一般是 2.2V,2.9V的样子,不准确,仅供参考. 2.电流驱动能力不 ...
- strcpy和strncpy用法和区别
1. strcpy函数:顾名思义字符串复制函数:原型:extern char *strcpy(char *dest,char *src); 功能:把从src地址开始且含有NULL结束符的字符串赋值到以 ...
- Python类元编程
类元编程是指在运行时创建或定制类.在Python中,类是一等对象,因此任何时候都可以使用函数创建新类,而无需用class关键字.类装饰器也是函数,不过能够审查.修改,甚至把被装饰的类替换成其他类.元类 ...
- 深入Python底层,谈谈内存管理机制
说到内存管理,就先说一下垃圾回收吧.垃圾回收是Python,Java等语言管理内存的一种方式,说的直白些,就是清除无用的垃圾对象.C语言及C++中,需要通过malloc来进行内存的申请,通过free而 ...
- jmeter所有版本下载路径
https://archive.apache.org/dist/jmeter/binaries/
- Flask_配置文件
flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: default_config = ImmutableDict({ 'DEBUG': get_debug ...
- Educational Codeforces Round 34 (Rated for Div. 2)
A. Hungry Student Problem time limit per test 1 second memory limit per test 256 megabytes input sta ...