Objective-c:如何在NSTask中使用NSPipe输出非法命令echo?

时间:2012-05-16 15:04:58

标签: objective-c shell nstask nspipe

我的代码如下,没关系,但我有2个问题。

1)如果我为 sh 分配了一些非法的段落,例如@“ls - l”,则 outString 为空。也就是说,它无法捕获错误警告“ls: - :没有这样的文件或目录 ls:l:没有这样的文件或目录“。我怎么处理它?<​​/ p>

2)如何实现此功能:假设应用的当前目录是“/ user / Doc”,我执行 sh = @“cd /”,然后我执行 sh = @“ls -l”来查看“/”下的内容 下一个循环的目录。但是当新循环开始时,当前目录将恢复为“/ user / Doc”。如何保持最后一个循环的任务环境?

此外,我可以保持执行“/ bin / sh”的持久性任务,就像直接在终端上工作一样吗?

NSString *sh = @"ls -l";
while(sh != @"end"){
    NSTask *shData = [[NSTask alloc] init];
    [shData setLaunchPath: @"/bin/sh"];

    NSArray *args;
    args = [NSArray arrayWithObjects: @"-c", sh, nil];
    [shData setArguments: args];

    NSPipe *myPipe;
    myPipe = [NSPipe pipe];
    [shData setStandardOutput: myPipe];
    [shData setStandardInput:[NSPipe pipe]];

    NSFileHandle *file;
    file = [myPipe fileHandleForReading];

    [shData launch];

    NSData *data1;    
    data1 = [file readDataToEndOfFile];

    NSString *outString;
    outString = [[NSString alloc] initWithData: data1 encoding: NSUTF8StringEncoding];

    NSLog(@"%@",outString);
}

1 个答案:

答案 0 :(得分:3)

  1. 该字符串是标准错误,而不是标准输出。由于您没有检查错误流,因此无法找到它。

  2. 这不是子弹的工作方式。谷歌为“为什么cd内置shell”提供了大量信息。