2011-12-28 5 views
2

После повторного поиска я не нашел элегантного решения этой проблемы: как запустить команду оболочки в obj-c и получить ее вывод. Я прочитал много вопросов по этому поводу, но все они не могут ответить на мой вопрос.Как запустить команду оболочки в какао и получить выход?

Некоторые получают значение выхода (Get result from shell script objective-c), другие выполняют только команду (Cocoa/ Objective-C Shell Command Line Execution), и, наконец, другие меня записывают вывод в файл (Execute a terminal command from a Cocoa app).

Я действительно хотел бы избежать написания/чтения файла, поскольку это не очень чистое решение.

Невозможно ли читать результат непосредственно в obj-c? Если да, то как?

+0

Пожалуйста, переформатируйте свой вопрос для лучшей читаемости. – tobiasbayer

+0

Извините, я сделал предположение, что бэкэнд автоматически проанализирует URL-адреса. – Trcx

+0

Некоторые параграфы также будут большим улучшением. – tobiasbayer

ответ

2

Код из «doshellscript» из первой ссылки (Get result from shell script objective-c) на самом деле возвращает NSString с выходом команды. Если это не работает для вас, возможно, команда выводит поверх stderr, а не stdin? Вы уже пробовали это? Стандартный механизм запуска команд в Cocoa - это NSTask, поэтому определенно, по крайней мере, начинайте там.

+0

Спасибо, что указали это, Изначально я пропустил это чтение, прочитав из временного файла и получив код выхода сценария, обвиняю его в чтении в 2:30 утра. Сегодня утром с ясной головой (э) я смог разделить эту функцию и заставить ее работать. – Trcx

2

Посмотрите на класс PRHTask. Это замена NSTask с блоками завершения. https://bitbucket.org/boredzo/prhtask

Выписка из заголовка:

  • Во-первых, вместо того, чтобы установить собственную трубу для стандартного вывода и ошибок, вы можете сказать, задачу аккумулировать выход для вас, и получить его, когда задача завершается.
  • Во-вторых, когда процесс завершается, а не отправляет NSNotification, PRHTask будет вызывать любой из двух блоков, которые вы предоставляете. Если вы хотите, вы можете установить их на один и тот же блок.
0

Если ваша задача нуждается права администратора, вы можете захотеть взглянуть на STPrivilegedTask.

Смежные вопросы