Pregunta

¿Hay una manera que me permite ejecutar un script de shell, y mostrar el resultado en un NSTextView? No quiero ninguna entrada del usuario a la secuencia de comandos shell en absoluto, ya que se llama simplemente compilar un buch de archivos. La parte shell script funciona bien hasta ahora, pero simplemente no puede encontrar la manera de ejecutarlo y mostrar la salida en un NSTextView. Conozco a un shell script se puede ejecutar mediante el sistema () y NSTask, pero ¿cómo lo consigo de salida en un NSTextView?

¿Fue útil?

Solución

Si quieres expansión de comodines y luego pasar su comando de UNIX a / 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;

}

Otros consejos

NSTask tiene método setStandardOutput que acepta ya sea objeto NSFileHandle o NSPipe. Así que si crea objeto NSPipe y configurarlo como NSTask de standardOutput entonces se podría utilizar NSPipe de fileHandleForReading para obtener NSFileHandle de la cual, a su vez, podrás a readDataToEndOfFile o readDataOfLength: desea. Así que algo como esto haría (código no probado):

- (void)setupTask {
  // assume it's an ivar
  standardOutputPipe = [[NSPipe alloc] init];
  [myTask setStandardOutput:standardOutputPipe];
  // other setup code goes below
}

// reading data to NSTextField
- (void)updateOutputField {
  NSFileHandle *readingFileHandle = [standardOutputPipe fileHandleForReading];
  NSData *newData;
  while ((newData = [readingFileHandle availableData])) {
    NSString *newString = [[[NSString alloc] initWithData:newData encoding: NSASCIIStringEncoding] autorelease];
    NSString *wholeString = [[myTextField stringValue] stringByAppendingString:newString];
    [myTextField setStringValue:wholeString];
  }
  [standardOutputPipe release];
  standardOutputPipe = nil;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top