在Cocoa中获取shell脚本的输出

时间:2010-05-16 05:32:32

标签: cocoa nstextview shell

有没有办法让我运行shell脚本,并在NSTextView中显示输出?我根本不希望用户输入任何shell脚本,因为只是调用它来编译一大堆文件。 shell脚本部分到目前为止工作正常,但我无法弄清楚如何运行它并在NSTextView中显示输出。我知道可以使用system()和NSTask运行shell脚本,但是如何将它输出到NSTextView?

2 个答案:

答案 0 :(得分:3)

如果您想要通配符扩展,请将您的unix命令传递给/ bin / sh

- (NSString *)unixSinglePathCommandWithReturn:(NSString *) command {
    // performs a unix command by sending it to /bin/sh and returns stdout.
    // trims trailing carriage return
    // not as efficient as running command directly, but provides wildcard expansion

    NSPipe *newPipe = [NSPipe pipe];
    NSFileHandle *readHandle = [newPipe fileHandleForReading];
    NSData *inData = nil;
    NSString* returnValue = nil;

    NSTask * unixTask = [[NSTask alloc] init];
    [unixTask setStandardOutput:newPipe];
    [unixTask setLaunchPath:@"/bin/csh"];
    [unixTask setArguments:[NSArray arrayWithObjects:@"-c", command , nil]]; 
    [unixTask launch];
    [unixTask waitUntilExit];
    int status = [unixTask terminationStatus];

    while ((inData = [readHandle availableData]) && [inData length]) {

        returnValue= [[NSString alloc] 
                      initWithData:inData encoding:[NSString defaultCStringEncoding]];

        returnValue = [returnValue substringToIndex:[returnValue length]-1];

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

    return returnValue;

}

答案 1 :(得分:1)

NSTask具有接受setStandardOutputNSFileHandle对象的NSPipe方法。因此,如果您创建NSPipe对象并将其设置为NSTask的{​​{1}},那么您可以使用standardOutput的{​​{1}}来获取NSPipe反过来,您将能够fileHandleForReadingNSFileHandle。所以这样的事情会做(代码未经测试):

readDataToEndOfFile