Execute a terminal command from a Cocoa app

后端 未结 12 2134
既然无缘
既然无缘 2020-11-22 06:34

How can I execute a terminal command (like grep) from my Objective-C Cocoa application?

12条回答
  •  孤独总比滥情好
    2020-11-22 06:49

    I wrote this "C" function, because NSTask is obnoxious..

    NSString * runCommand(NSString* c) {
    
        NSString* outP; FILE *read_fp;  char buffer[BUFSIZ + 1];
        int chars_read; memset(buffer, '\0', sizeof(buffer));
        read_fp = popen(c.UTF8String, "r");
        if (read_fp != NULL) {
            chars_read = fread(buffer, sizeof(char), BUFSIZ, read_fp);
            if (chars_read > 0) outP = $UTF8(buffer);
            pclose(read_fp);
        }   
        return outP;
    }
    
    NSLog(@"%@", runCommand(@"ls -la /")); 
    
    total 16751
    drwxrwxr-x+ 60 root        wheel     2108 May 24 15:19 .
    drwxrwxr-x+ 60 root        wheel     2108 May 24 15:19 ..
    …
    

    oh, and for the sake of being complete / unambiguous…

    #define $UTF8(A) ((NSString*)[NSS stringWithUTF8String:A])
    

    Years later, C is still a bewildering mess, to me.. and with little faith in my ability to correct my gross shortcomings above - the only olive branch I offer is a rezhuzhed version of @inket's answer that is barest of bones, for my fellow purists / verbosity-haters...

    id _system(id cmd) { 
       return !cmd ? nil : ({ NSPipe* pipe; NSTask * task;
      [task = NSTask.new setValuesForKeysWithDictionary: 
        @{ @"launchPath" : @"/bin/sh", 
            @"arguments" : @[@"-c", cmd],
       @"standardOutput" : pipe = NSPipe.pipe}]; [task launch];
      [NSString.alloc initWithData:
         pipe.fileHandleForReading.readDataToEndOfFile
                          encoding:NSUTF8StringEncoding]; });
    }
    

提交回复
热议问题