我想在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字节
答案 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