0

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

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

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);
4

1 回答 1

1

我不知道cd /cmd 是否与其他 shell 命令不同。

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


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

  • 您可以尝试启动任务,然后将数据发送到输入管道,然后关闭输入管道。当任务看到输入结束时,它将关闭输出管道,这意味着您的调用-availableData将返回文件结尾。

  • 您可以使用运行循环异步读取输出。这更加灵活,因为您不必一次发送所有命令。完成后,您仍然需要关闭输入。

  • 您可以在 NSOperation 中读取输出,从而有效地将其放在不同的线程上。同样,您仍然需要在完成后关闭输入管道。

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

于 2012-05-17T16:24:54.250 回答