NSTask是MAC OS X用来执行系统命令的一个类库,作用类似php的exec,最近在使用过程中遇到诸多不顺,结合以前的经验,记录一下,方便后来人
1.推荐使用Taskit
功欲善其事,必先利其器。使用现成的可能的开源类库才是王道,毕竟重复造轮子的事儿还是交给牛人去做吧,这里推荐使用Taskit。下载完以后里面有个示例工程,简单明了。
task.launchPath = @"/bin/echo";
[task.arguments addObject:@"Hello World"];
task.receivedOutputString = ^void(NSString *output) {
NSLog(@"%@", output);
};
[task launch];
2.参数传递
1).参数带引号的情况(或者说有空格)
我们知道有一此命令的参数里是带空格的,这时候就需要用引号把这个参数引起来,比如一个带空格的路径的情况
Color Themes/
这个时候直接[task.arguments addObject:@"Library/Application Support/Xcode"]就可以了,不用考虑空格的情况
2).参数–的情况
比如有一些命令是用–help查询帮助的,但是使用NSTask的时候,用–help死活不好使,还不报错,这个时候你会发现下面的语句就好使
3.环境变量
有一些命令是需要环境变量支持的。比如《最近研究xcodebuild批量打包的一些心得》里提到的xcode给文件签名
CODE_SIGN_IDENTITY=”iPhone Distribution:XXXXXX” 看似一个参数,实际是个环境变量,要按环境变量来处理
forKey:@"CODE_SIGN_IDENTITY"];
4.清楚的明白你要执行的命令
这里要说的就是:不要只盯着正常输出!有些命令的所有正常输出都是输出到错误输出的,而有一命令的帮助信息都是输出到错误输出的!所以当你总是得不到output的时候,尝试获取一下errorput!
正常输出都输出到错误输出的例子:ssh,scp
帮助信息输出到错误输出的例子:xcun –help
当然了这些命令在Terminal(终端)执行的时候,都是可以正常使用的!
关于使用特权的另类用法
有的时候有一些命令是需要root权限才可以执行的。这个时候NSTask怎样获取系统权限呢?我表示我不知道!所以需要用系统权限执行的命令我就不用NSTask了,我用的Apple Script!
NSString *script = @"do shell script \"/bin/ls\" with administrator privileges";
NSAppleScript *appleScript = [[NSAppleScript new] initWithSource:script];
NSAppleEventDescriptor *des = [appleScript executeAndReturnError:&error];
NSLog(@"%@",des.stringValue);