Вот мой код:
task = [[NSTask alloc] init];
[task setCurrentDirectoryPath:@"/applications/jarvis/brain/"];
[task setLaunchPath:@"/applications/jarvis/brain/server.sh"];
NSPipe * out = [NSPipe pipe];
[task setStandardOutput:out];
[task launch];
[task waitUntilExit];
[task release];
NSFileHandle * read = [out fileHandleForReading];
NSData * dataRead = [read readDataToEndOfFile];
NSString * stringRead = [[[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding] autorelease];
Таким образом, я пытаюсь копировать это:
cd /applications/jarvis/brain/
./server.sh
но с помощью NSTask в цели-c.
По некоторым причинам, хотя, то, когда я выполняю этот код, stringRead, ничего не возвращает. Это должно возвратить то, что возвращает терминал, когда я запускаю .sh файл. Корректный?
Какие-либо идеи?
Elijah
Ошибка Xcode
В Xcode есть ошибка, которая не позволяет ему печатать любой вывод после новой задачи с использованием стандартных запускается вывод (он собирает весь вывод, но больше ничего не печатает). Вам нужно будет вызвать [task setStandardInput: [NSPipe pipe]]
, чтобы заставить его снова показать вывод (или, в качестве альтернативы, распечатать задачу на stderr вместо stdout).
Предложение по окончательному коду:
NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/sh"];
[server setArguments:[NSArray arrayWithObject:@"/path/to/server.sh"]];
[server setCurrentDirectoryPath:@"/path/to/current/directory/"];
NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];
[server launch];
[server waitUntilExit]; // Alternatively, make it asynchronous.
[server release];
NSData *outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile];
NSString *outputString = [[[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease]; // Autorelease optional, depending on usage.