Как запустить эту команду в моем приложении какао? - PullRequest
0 голосов
/ 07 января 2011

Я нашел что-то в NSTask для выполнения команды, но не могу заставить ее работать.

Это моя команда:

ioreg -c BNBMouseDevice | grep BatteryPercent

Как мне запустить ЭТО в моем приложении с какао? (программно конечно)

Большое спасибо за вашу помощь.

Я пробовал это:

NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/sh"];
[server setArguments:[NSArray arrayWithObject:@"ioreg -c BNBMouseDevice | grep BatteryPercent"]];
NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];
[server launch];
[server waitUntilExit];
[server release];
NSData *outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile];
NSString *outputString = [[[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease]; 

но он говорит, что нет такого файла или каталога, но если я делаю это в терминале:

ioreg -c BNBMouseDevice | grep BatteryPercent

это работает!

что не так?

Ответы [ 2 ]

3 голосов
/ 07 января 2011

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

Просто введите команду ioreg через NSTask, возьмите вывод стандартными средствами, затем выполните простое перечисление возвращенной строки, чтобы найти нужные строки. Хотя еще несколько строк кода, он будет значительно менее хрупким (и менее опасным, если вы когда-либо предоставите какие-либо аргументы), чем пытаться прокачать его через оболочку. И это легко сделать.

См. этот документ для получения дополнительной информации.

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

При вызове /bin/sh вам нужно передать -c, если вы хотите, чтобы оболочка запускала команду.Это должно быть эквивалентно:

/bin/sh -c "/usr/sbin/ioreg -c BNBMouseDevice | /usr/bin/grep BatteryPercent"

Вы можете сделать это, заменив

[server setArguments:[NSArray arrayWithObject:@"ioreg -c BNBMouseDevice | grep BatteryPercent"]];

на

[server setArguments:[NSArray arrayWithObjects:@"-c", @"/usr/sbin/ioreg -c BNBMouseDevice | /usr/bin/grep BatteryPercent", nil]];

Обратите внимание, что я сделал два изменения:Аргументы - это массив с двумя элементами, а именно "-c" и "/ usr / sbin / ioreg -c BNBMouseDevice | / usr / bin / grep BatteryPercent", и я также заменил ioreg на /usr/sbin/ioreg (и grepс /usr/bin/grep), чтобы четко указать, что вы заинтересованы в этих конкретных программах.

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