0

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

1) 如果我为sh分配了一些非法参数,例如 @"ls - l",那么outString为空。也就是说,它无法捕获错误警告“ls: -: No such file or directory ls: l: No such file or directory”。我该如何处理?

2)如何实现这个功能:假设app的当前目录是"/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);
}
4

1 回答 1

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

  2. 这不是子shell的工作方式。谷歌“为什么 cd 是一个内置的 shell”以获得大量信息。

于 2012-05-16T15:25:36.730 回答