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