Obtención de salida de un script de shell en Cocoa
-
27-09-2019 - |
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?
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;
}