2014-11-25 62 views
1

我想叫可可应用UNIX命令,但它不工作,我想叫可可应用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

NSTask不运行Unix的“命令”,而它运行在Unix“过程”,而不同的是至关重要的。

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

当您在Unix命令提示符下键入时,例如“echo Hello”,您正在将数据输入到命令解释程序“shell”中。 shell必须定位应用程序“echo”才能启动运行它的进程。 shell通过搜索PATH环境变量指定的一组目录来执行此操作,在“echo”的情况下找到“/ bin/echo”。这是你必须设置launchPath属性的路径。

如果你想使用NSTask为此,你有两个基本的选择(一)有你的代码找到“LUA”二进制文件本身或(b)使用NSTask运行shell和有壳做正常的处理您。

标准的“sh”shell位于“/ bin/sh”。如果你阅读它的手册页,你会看到它需要一个选项“-c 字符串”,它指示它将字符串作为命令输入。 E.g考虑以下终端成绩单:

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

在第一种情况下,壳发现“回声”的二进制,并且通过它的“Hello”执行。在第二个中,它找到了“sh”的二进制文件,并执行了传递它的“-c”和“echo Hello”,该进程又找到了“echo”的二进制文件。

所以使用NSTask你可以调用“/ bin/sh”并将其作为参数“-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

相关问题