Como usar comandos de terminal de execução do NSTask em loop em ambiente consistente?

Eu quero usar o NSTask para simular o Terminal para executar comandos. Os códigos da seguinte maneira. Pode obter entrada em loop e retornar a saída do processo.

int main(int argc, const char * argv[])
{
  @autoreleasepool {      
    while (1) {
        char str[80] = {0};
        scanf("%s", str);
        NSString *cmdstr = [NSString stringWithUTF8String:str];

        NSTask *task = [NSTask new];
        [task setLaunchPath:@"/bin/sh"];
        [task setArguments:[NSArray arrayWithObjects:@"-c", cmdstr, nil]];

        NSPipe *pipe = [NSPipe pipe];
        [task setStandardOutput:pipe];

        [task launch];

        NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];

        [task waitUntilExit];

        NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", string);

    }
}

Minha pergunta é: quando um loop é finalizado, o ambiente em execução é restaurado para o estado de inicialização. Por exemplo, o caminho de execução padrão é/Users/applee eu corrocd / para mudar o caminho para/e, em seguida, executepwd, retorne o/Users/apple em vez do/.

Então, como posso usarNSTask simular completamente o terminal?

questionAnswers(1)

yourAnswerToTheQuestion