NSTask代码,使用objectivec,来获取命令行输出不再在El Capitan中工作

时间:2015-10-26 16:56:53

标签: objective-c osx-elcapitan

以下代码以前在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"];

提前感谢您的建议!

2 个答案:

答案 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];