以下代码以前在OS X Yosemite中运行良好,但现在它通常在OS X El Capitan中不起作用,通常返回一个空字符串,用于输出。
- (NSString*)runCommandLine:(NSString*)executable withArgs:(NSString*)arg {
NSTask *commandLine = [[NSTask alloc] init];
[commandLine setLaunchPath: executable];
NSLog(@"CL EXECUTABLE: %@",executable);
NSArray *arguments = [NSArray arrayWithObjects: arg, nil];
[commandLine setArguments: arguments];
NSLog(@"CL ARGUMENTS: %@",arguments);
NSPipe *pipe = [NSPipe pipe];
[commandLine setStandardOutput: pipe];
NSFileHandle *file = [pipe fileHandleForReading];
[commandLine launch];
[commandLine waitUntilExit];
NSData *data = [file readDataToEndOfFile];
NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog(@"CL OUTPUT: %@",output);
return output;
}
然后我使用以下示例调用它。没有错误,输出很简单“”,终止状态是1:
NSString *adbLocation = [self runCommandLine:@"/usr/bin/which" withArgs: @"adb"];
此ls的示例正常工作(终止状态为0)。
NSString *lsOutput = [[self runCommandLine:@"/usr/local/opt/coreutils/libexec/gnubin/ls" withArgs: @"-la"];
提前感谢您的建议!
答案 0 :(得分:0)
NSString *whoamiOutput = [self runCommandLine:@"/usr/bin/whoami" withArgs: @""];
以上不对应于以下内容:
$ /usr/bin/whoami
它对应于:
$ /usr/bin/whoami ""
对我来说,在Yosemite上,这会将使用消息写入标准错误(非标准输出)并退出状态1.因此,这与您所看到的完全一致。
您需要一种不指定参数的方法。根据您用来设置任务的arguments
属性的代码,您只需传递nil
而不是您当前正在传递的空字符串。
(当然,正如vadian在评论中指出的那样,在一个真实的应用程序中这是一个荒谬的事情。希望这只是一个例子用于说明目的。)
答案 1 :(得分:0)
感谢Ken让我朝着正确的方向前进。
我通过这样做解决了这个问题:
NSString *executable = @"/bin/bash"
我的which adb
示例:
NSArray *arguments = [NSArray arrayWithObjects: @"-l",@"-c",@"which adb",nil];