How check if output of bash script contains a certain string in Objective-C?

I would like to do something if the output of a shell script contains the string "Caddy 2 serving static files on :2015". This is what I have so far but the beach ball is just spinning. It seems it is because of the last command in my bash script which starts a server. There is no exit in the bash script so it does not end. The output of the bash script is correct and I can see "Caddy 2 serving static files on :2015". But it seems this code is only working with a bash script which has a end.

- (IBAction)localHost:(id)sender
{
    // execute bash script to start server
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath:@"/bin/bash"];
    [task setArguments:[NSArray arrayWithObjects:[[NSBundle mainBundle] pathForResource:@"caddy-start" ofType:@""], nil]];
    
    NSPipe *pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];
    NSFileHandle *file = [pipe fileHandleForReading];
    
    [task launch];
    
    NSData *data = [file readDataToEndOfFile];
    NSString *result = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    
    NSLog(result);
    
    NSString *string = result;
    NSString *substring = @"Caddy 2 serving static files on :2015";
    if ([string rangeOfString:substring].location != NSNotFound) {
        NSLog(@"Yes it does contain that substring");
    }
    else if ([string rangeOfString:substring].location == NSNotFound) {
        NSLog(@"No it does NOT contain that substring");
    }
    
    // wait 3 seconds
    [NSThread sleepForTimeInterval:3.0f];
    
    // open local host
    //[self loadPage:@"http://127.0.0.1:8000/"]; // python2 server
    [self loadPage:@"http://127.0.0.1:2015/"]; // caddy server
    //[self loadPage:@"http://localhost:2015"];
}

And here is my bash script:

#!/bin/bash
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
cd "${DIR}"

pwd

#open http://localhost:2015

# kill server if already running
kill -9 $(lsof -ti:2015)
(./caddy_darwin_amd64 stop) &
(./caddy_darwin_amd64 file-server --listen :2015 --root Content/) &

You’ve told NSFileHandle to read until the end of file. If the script never ends then there is no end of file, and thus that call never completes.

To get this to work you need read data as it comes in. How you do that kinda is tricky given the context of the code you posted. Specifically, that code currently runs synchronously, which isn’t a good idea. You normally want this stuff to run asynchronously, but that requires more state management on your part.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

How check if output of bash script contains a certain string in Objective-C?
 
 
Q