【问题标题】:I want call unix command in cocoa application,but it doesn't work,我想在可可应用程序中调用 unix 命令,但它不起作用,
【发布时间】:2014-11-25 13:32:11
【问题描述】:

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

【问题讨论】:

    标签: cocoa unix command


    【解决方案1】:

    NSTask 不运行 Unix“命令”,而是运行 Unix“进程”,区别很关键。

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

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

    如果您希望为此使用NSTask,您有两个基本选择(a)让您的代码定位“lua”二进制文件本身或(b)使用NSTask运行一个shell并让那个shell执行它为您正常处理。

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

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

    在第一种情况下,shell 找到了 "echo" 的二进制文件并执行它并传递了 "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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 2019-04-17
      • 1970-01-01
      相关资源
      最近更新 更多