最近在研究自动化打包,不可避免的要涉及到shell命令的使用。
我的想法是写好shell脚本后用oc写个图形化界面来调用。
查了资料后知道oc调用shell使用NSTask这个类。
本文分两部分,Objective-C调用shell脚本、Objective-C调用shell命令
1.Objective-C调用shell脚本
NSTask调用shell脚本的一般使用方法是:
//脚本路径
NSString shellPath = @"/Users/Apple/Desktop/test.sh";
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];
NSArray *arguments =@[shellPath];
[task setArguments: arguments];
[task launch];
其中shellPath就是脚本所在的路径,如果有需要传入脚本的参数的话就添加在arguments里:
NSArray *arguments =@[shellPath,@"argument1",@"argument2"....];
NSTask有个-(void)waitUntilExit方法,添加在[task launch]之后可以等待脚本执行完再执行接下来的代码:
NSString shellPath = @"/Users/Apple/Desktop/test.sh";
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];
NSArray *arguments =@[shellPath];
[task setArguments: arguments];
[task launch];
[task waitUntilExit];
// 其他的代码
不过这样有个问题是在图形化界面中阻塞主线程的话会导致程序卡死,所以要把它放到多线程里执行:
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
NSString shellPath = @"/Users/Apple/Desktop/test.sh";
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];
NSArray *arguments =@[shellPath];
[task setArguments: arguments];
[task launch];
[task waitUntilExit];
// 其他的代码
});
封装一下,从外部传入脚本路径和参数,执行完毕后通过block回调:
+(void)runShellWithArguments:(NSArray *)arguments completeBlock:(dispatch_block_t)completeBlock{
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:arguments];
[task launch];
[task waitUntilExit];
dispatch_async(dispatch_get_main_queue(), ^{
if (completeBlock) {
completeBlock();
}
});
});
}
这里我把脚本路径和参数放到同一个数组里了,第0位是脚本路径,之后是参数。
2.Objective-C调用shell命令
NSTask调用shell命令的一般方法是:
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];
NSArray *arguments = [NSArray arrayWithObjects: @"-c",@"echo hello world", nil];
[task setArguments: arguments];
同样封装一下:
+(void)runShellWithCommand:(NSString *)command completeBlock:(dispatch_block_t)completeBlock{
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects:@"-c",command, nil];
[task setArguments: arguments];
[task launch];
[task waitUntilExit];
dispatch_async(dispatch_get_main_queue(), ^{
if (completeBlock) {
completeBlock();
}
});
});
}