我想在cocoa应用程序中调用unix命令,但它不起作用,

时间:2014-11-25 13:32:11

标签: cocoa unix command

我想在cocoa应用程序中调用unix命令,但它不起作用,

命令:" lua -v"

可可代码:

NSArray *cmdArray = [cmd componentsSeparatedByString:@" "];
NSPipe *pipe = [NSPipe pipe];
NSFileHandle *file = pipe.fileHandleForReading;

NSTask *task = [[NSTask alloc] init];
[task setStandardOutput:pipe];
task.launchPath = cmdArray[0];
if(cmdArray.count > 1)
{
    task.arguments = [cmdArray subarrayWithRange:NSMakeRange(1, cmdArray.count - 1)];
}
[task launch] ;
NSData *data = [file readDataToEndOfFile];
[file closeFile] ;

NSString *grepOutput = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return grepOutput;

数据始终为0字节

1 个答案:

答案 0 :(得分:0)

NSTask不运行Unix"命令"而是运行Unix"进程",差异至关重要。

当您的代码在Xcode中运行时,您应该看到"启动路径无法访问"在控制台窗口中,这是您的问题的线索。 launch的文档告诉您如果启动路径无效,则会引发异常。

当你打字时,比如说," echo Hello"在Unix命令提示符下,您将数据输入命令解释器," shell"。 shell必须找到应用程序" echo"为了启动运行它的进程。 shell通过搜索PATH环境变量指定的一组目录来完成此操作,对于" echo"它找到" / bin / echo"。您必须将此launchPath属性设置为此路径。

如果您希望NSTask用于此目的,您有两个基本选择(a)让您的代码找到" lua"二进制本身或(b)使用NSTask来运行shell并让shell为你进行正常处理。

标准" sh" shell位于" / bin / sh"。如果您阅读了它的手册页,您会看到它需要一个选项" -c string "它指示它将 string 视为命令输入。例如,考虑以下终端成绩单:

crd$ echo Hello
Hello
crd$ sh -c "echo Hello"
Hello
crd$

在第一种情况下,shell发现二进制文件为" echo"并执行传递它"你好"。在第二个中,它找到了" sh"并执行传递它" -c"和#34; echo Hello",该过程依次找到" echo"的二进制文件。

所以使用NSTask你可以调用" / bin / sh"并将其作为参数传递#34; -c"然后,shell会像在终端中那样解析你的命令行并调用你的命令,这就是:

NSPipe *pipe = [NSPipe pipe];
NSFileHandle *file = pipe.fileHandleForReading;

NSTask *task = [[NSTask alloc] init];
task.standardOutput = pipe;
task.standardError =pipe;  // capture any error messages the sh writes, could send to another pipe
task.launchPath = @"/bin/sh";
task.arguments = @[@"-c", cmd];

[task launch];
NSData *data = [file readDataToEndOfFile];
[file closeFile];

HTH