Выполнить сценарий оболочки из какао (obj.c) с ответом - PullRequest
4 голосов
/ 11 января 2011

У меня есть что-то вроде:

- (NSString *)unixSinglePathCommandWithReturn:(NSString *)command
{
NSPipe *newPipe = [NSPipe pipe];
NSFileHandle *readHandle = [newPipe fileHandleForReading];

NSTask *unixTask = [[NSTask alloc] init];
[unixTask setStandardOutput:newPipe];
[unixTask setLaunchPath:@"/bin/sh"];
[unixTask setArguments:[NSArray arrayWithObjects:@"-c", command , nil]]; 
[unixTask launch];
[unixTask waitUntilExit];

NSString *output = [[NSString alloc] initWithData:[readHandle readDataToEndOfFile] encoding:NSUTF8StringEncoding];

return output;
}

Но это не работает, как ожидалось. Я звоню, когда нажимаю кнопку. Если я удаляю строку с 'waitUntilExit', она работает как положено, но только один раз. Когда он там, он не работает. Я пробовал также некоторые базовые команды, такие как 'ls', 'ping -c1 google.com' и тому подобное, но я не могу заставить его работать каким-то образом. Если у вас есть другой подход к запуску сценариев оболочки в какао с получением ответа, пожалуйста, дайте мне сейчас. Спасибо всем:)

Ответы [ 4 ]

5 голосов
/ 11 января 2011

Привет, Кукоск. Есть комментарий к CocoaDev о NSLog() проблемах при запуске NSTask. Исправление заключается в установке канала для stdin перед запуском задачи:

[task setStandardInput:[NSPipe pipe]];

Если вы используете NSLog() только для проверки выполнения задачи, это может решить вашу проблему. В качестве альтернативы, вы можете попытаться представить output в вашем графическом интерфейсе вместо использования NSLog().

2 голосов
/ 11 января 2011

Проблема в том, что вы не очищаете выходные буферы задачи.Вы не можете просто запустить задачу и waitUntilDone, если задача также не генерирует чрезвычайно малый объем данных.

waitUntilDone, очевидно, не будет работать вообще с задачей, которая никогда не завершается.

Для задачи, которая генерирует любое количество выходных данных, вам необходимо настроить ее так, чтобы выходные данные читались по мере их генерирования.Обычно вы используете readInBackgroundAndNotify или его вариант.

В любом случае, верхняя часть описания класса для NSTask содержит как ссылки на концептуальное руководство, так и серию примеров, которые охватывают это.

0 голосов
/ 11 января 2011

Для различных подходов к запуску сценариев оболочки в Какао взгляните на AMShellWrapper, PseudoTTY.app или OpenFileKiller!

http://www.cocoadev.com/index.pl?NSTask

0 голосов
/ 11 января 2011

Ах, есть очень важная строка в документах, которые вы, кажется, пропустили, одно из тех раздражений, которые NextStep любит: «Объект NSTask может быть запущен только один раз. Последующие попытки запустить задачу вызывают ошибку».

Итак, подождите, и добавьте [unixTask release] перед возвращением. Если вы хотите запустить его снова, переделайте задачу.

NSTimer такой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...