使用objective-c-NsTask调用shell脚本

使用objective-c-NsTask调用shell脚本,objective-c,swift,xcode,macos,nstask,Objective C,Swift,Xcode,Macos,Nstask,我一直在用swift开发一个命令行工具,但由于可执行文件太大(大约10 mb),我需要用objective-c重新编写它。 现在我不是objective-c的粉丝,这要感谢它冗长的语法。 所以我有这个函数,我用它调用我的shell脚本并返回输出。 请把这个转换成objective-c,我现在很难 func shell(_ args: String) -> String { var outstr = "" let task = Process() task.launc

我一直在用swift开发一个命令行工具,但由于可执行文件太大(大约10 mb),我需要用objective-c重新编写它。 现在我不是objective-c的粉丝,这要感谢它冗长的语法。 所以我有这个函数,我用它调用我的shell脚本并返回输出。 请把这个转换成objective-c,我现在很难

func shell(_ args: String) -> String {
    var outstr = ""
    let task = Process()
    task.launchPath = "/bin/sh"
    task.arguments = ["-c", args]
    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    if let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue) {
        outstr = output as String
    }
    task.waitUntilExit()
    return outstr
}
然后我在swift中将这个方法称为

let shellOutput = shell("sh \(scriptPath) \(arg1) \(arg2)")

在标记为“重复”或“发布答案”之前,我确实需要在某个变量中输出shell脚本。

我想您会发现,通过包含您尝试编写的ObjC代码以及遇到的问题,可以获得更好的答案。你对哪一部分有困难?我要质疑这个前提。为什么10MB的可执行文件大小是一个问题?您尝试过哪些尺寸优化?是什么让你认为Objective C变体会更小?@Alexander膨胀的大小是因为swift不支持ABI。在objective-c中,字面上是kbs。原因是,我认为在构建搜索“[objective-c]nstask pipe.fileHandleForReading readdatatoendofile”时,可执行文件包含所有swift二进制文件,您会发现一些示例。
NSString *shell(NSString *args)
{
    NSTask *task = [NSTask new];
    task.launchPath = @"/bin/sh";
    task.arguments = @[ @"-c", args ];
    NSPipe *pipe = [NSPipe new];
    task.standardOutput = pipe;
    [task launch];
    NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
    NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    [task waitUntilExit];
    return output;
}