Вы можете попытаться обработать вывод server.sh, используя только один NSTask, который вызывает: sh -c 'source server.sh | sed "/ Jarvis> / q" '(ср. шстринг). В этом упрощенном примере кода server.sh (shfile) просто содержит одну команду cat (1) для записи содержимого test.file в стандартный вывод. Может быть, вы можете просто добавить команду java, которая вызывается из Objective-C, в shstring?
#import <Foundation/Foundation.h>
/*
See:
/2404844/ya-ne-vizhu-vyvod-nstask-target-c-java
compile with:
gcc -Wall -O3 -x objective-c -fobjc-exceptions -framework Foundation -o test test.c
./test
# create test.file
n=50
jot -b 'line' $n | nl -w 10 > test.file
echo "Jarvis>" | nl -w 10 -v $((n+1)) >> test.file
jot -b 'line' 19 | nl -w 10 -v $((n+2)) >> test.file
ls -lh test.file
tail -n 100 test.file
# create server.sh
echo '
cat test.file
' > server.sh
sh server.sh
./test
*/
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *shfile = @"server.sh";
NSString *shstring = [NSString stringWithFormat:
@"%@ %@ %@",
@"source",
shfile,
@"| /usr/bin/sed '/Jarvis>/q'"
];
NSTask *sh = [NSTask new];
NSPipe *pipe = [NSPipe new];
[sh setLaunchPath:@"/bin/sh"];
[sh setArguments:[NSArray arrayWithObjects: @"-c", shstring, nil ]];
[sh setCurrentDirectoryPath:@"."];
//[sh setStandardInput:[NSFileHandle fileHandleWithNullDevice]];
[sh setStandardError:[NSFileHandle fileHandleWithNullDevice]];
[sh setStandardOutput:pipe];
[sh launch];
NSData *data = [[[sh standardOutput] fileHandleForReading] readDataToEndOfFile];
NSString *string = [[[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding] autorelease];
NSLog(@"\n\n%@\n", string);
[pool release];
return 0;
}