Objective-C (см. Ниже для Swift)
Очистил код в верхнем ответе, чтобы сделать его более читабельным, менее избыточным, добавил преимущества однострочный метод и превратил его в категорию NSString
@interface NSString (ShellExecution)
- (NSString*)runAsCommand;
@end
Реализация:
@implementation NSString (ShellExecution)
- (NSString*)runAsCommand {
NSPipe* pipe = [NSPipe pipe];
NSTask* task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];
[task setArguments:@[@"-c", [NSString stringWithFormat:@"%@", self]]];
[task setStandardOutput:pipe];
NSFileHandle* file = [pipe fileHandleForReading];
[task launch];
return [[NSString alloc] initWithData:[file readDataToEndOfFile] encoding:NSUTF8StringEncoding];
}
@end
Использование:
NSString* output = [@"echo hello" runAsCommand];
И , если у вас проблемы с выходной кодировкой:
// Had problems with `lsof` output and Japanese-named files, this fixed it
NSString* output = [@"export LANG=en_US.UTF-8;echo hello" runAsCommand];
Надеюсь, это так же полезно для вас, как и для меня в будущем. (Привет, ты!)
Swift 4
Вот пример Swift, использующий Pipe
, Process
и String
extension String {
func run() -> String? {
let pipe = Pipe()
let process = Process()
process.launchPath = "/bin/sh"
process.arguments = ["-c", self]
process.standardOutput = pipe
let fileHandle = pipe.fileHandleForReading
process.launch()
return String(data: fileHandle.readDataToEndOfFile(), encoding: .utf8)
}
}
Использование:
let output = "echo hello".run()