首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSTask执行外壳命令时,通过NSPipe输出的奇怪问题

使用NSTask执行外壳命令时,通过NSPipe输出的奇怪问题
EN

Stack Overflow用户
提问于 2012-05-18 00:12:28
回答 1查看 401关注 0票数 0

这是我的代码。当我设置myCmd=@"cd /\nls -l\n"myCmd=@"ls -l\n"时,没有问题。但是,当我设置myCmd=@"cd /\n"时,if ((output =[[outPipe fileHandleForReading] availableData]) && [output length])行中的program是死的,并且没有任何调试信息输出。

我不知道"cd /"命令是否与其他外壳命令不同。你能给我一些建议吗?

代码语言:javascript
复制
NSData *inputData = [myCmd dataUsingEncoding:NSUTF8StringEncoding];
NSPipe *inPipe = [NSPipe pipe];
NSFileHandle *fh = [inPipe fileHandleForWriting];
[fh writeData: inputData];
NSPipe *outPipe = [NSPipe pipe];
//NSPipe *errPipe = [NSPipe pipe];
NSTask *task = [[NSTask alloc] init];
[task setStandardInput:inPipe];
[task setStandardOutput:outPipe];
[task setStandardError:outPipe];
[task setLaunchPath:@"/bin/sh"];
NSArray *args = [NSArray arrayWithObject:@"-s"];
[task setArguments:args];

[task launch];

NSData *output;
NSString *string;

if ((output =[[outPipe fileHandleForReading] availableData]) && [output length]) 
{
    string = [[NSString alloc] initWithFormat:@"%.s", [output bytes]];
}
NSLog(@"%@", string);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-18 00:24:54

我不知道cd /命令是否与其他外壳命令不同。

它与ls -l的不同之处在于它不写任何输出。您的程序可能在调用-availableData时被阻塞。

不幸的是,我没有时间尝试任何想法,但这里有一些你可以尝试的东西。

  • 您可以尝试启动任务,然后沿着输入管道发送数据,然后关闭输入管道。当任务看到输入的末尾时,它将关闭输出管道,这意味着您对-availableData的调用将返回文件的末尾。
  • 您可以使用run循环异步读取输出。这更加灵活,因为您不必一次发送所有命令。你仍然需要在完成后关闭输入。
  • 你可以在一个NSOperation中读取输出,这实际上将它放在一个不同的线程上。同样,您仍然需要在完成后关闭输入管道。

顺便说一下,我应该指出,将cd作为最后一件事发送到shell是一个毫无意义的操作。接下来发生的事情是shell退出,cd结果丢失。如果您的目标是更改当前进程中的目录,请查看 [NSFilemanager changeCurrentDirectoryPath:]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10639418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档