在Objective-C中调用shell脚本、shell命令

最近在研究自动化打包,不可避免的要涉及到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();
            }
        });
    });
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值