gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:21:10 26 4
gpt4 key购买 nike

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

命令:“lua -v”

cocoa 代码:

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 字节

最佳答案

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”shell 位于“/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

关于cocoa - 我想在cocoa应用程序中调用unix命令,但它不起作用,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27128115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com