使用响应从cocoa(obj.c)执行shell脚本

时间:2011-01-10 22:14:37

标签: objective-c cocoa macos bash shell

我有类似的东西:

- (NSString *)unixSinglePathCommandWithReturn:(NSString *)command
{
NSPipe *newPipe = [NSPipe pipe];
NSFileHandle *readHandle = [newPipe fileHandleForReading];

NSTask *unixTask = [[NSTask alloc] init];
[unixTask setStandardOutput:newPipe];
[unixTask setLaunchPath:@"/bin/sh"];
[unixTask setArguments:[NSArray arrayWithObjects:@"-c", command , nil]]; 
[unixTask launch];
[unixTask waitUntilExit];

NSString *output = [[NSString alloc] initWithData:[readHandle readDataToEndOfFile] encoding:NSUTF8StringEncoding];

return output;
}

但它没有按预期工作。我点击按钮时调用它。如果我删除'waitUntilExit'的行,它按预期工作,但只有一次。当它在那里时,它不起作用。 我还尝试了一些基本的命令,比如'ls''ping -c1 google.com'和类似的东西,但我无法以某种方式让它工作。如果你有一些不同的方法在cocoa中运行shell脚本并收到响应,那么现在就让我吧。谢谢大家:))

4 个答案:

答案 0 :(得分:5)

嘿,库科斯克。在运行NSTask时,CocoaDevNSLog()问题发表了评论。修复是在启动任务之前为stdin设置管道:

[task setStandardInput:[NSPipe pipe]];

如果您仅依靠NSLog()检查任务是否已运行,则可能会解决您的问题。或者,您可以尝试在GUI中显示output,而不是使用NSLog()

答案 1 :(得分:2)

问题是你没有清空任务的输出缓冲区。您不能简单地启动任务waitUntilDone,除非任务也发出极少量的数据。

对于永不退出的任务,

waitUntilDone显然无法正常工作。

对于发出任意数量输出的任务,您需要对其进行设置,以便在生成时读取输出。通常,您使用readInBackgroundAndNotify或其中的变体。

在任何情况下,NSTask的类描述的顶部都包含指向概念指南的链接以及涵盖此内容的一系列示例。

答案 2 :(得分:0)

啊,你似乎错过的文档中有一条非常重要的内容,这是NextStep似乎喜欢的一种烦恼:“NSTask对象只能运行一次。后续尝试运行任务会引发错误。”

所以,请等待,然后在返回之前添加[unixTask release]。如果要再次运行它,请重新制作任务。

NSTimer就是这样。

答案 3 :(得分:0)

有关在Cocoa中运行shell脚本的不同方法,请查看AMShellWrapper,PseudoTTY.app或OpenFileKiller!

http://www.cocoadev.com/index.pl?NSTask