我在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
它有效!
出了什么问题?
答案 0 :(得分:3)
NSTask
启动一个命令,该命令将一组参数作为字符串数组。 NSTask
不执行任何shell解析魔法,也不能将字符串作为参数传递给sh
并让它以这种方式解析它。可能有一种方法可以这样做,但有更好的解决方案。
只需通过ioreg
运行NSTask
命令,通过标准方法获取输出,然后对返回的字符串进行简单枚举,以找到所需的行。虽然还有一些代码行,但是如果你提供某种类型的参数,那么它的脆弱程度会小得多(而且安全漏洞也少一些),而不是试图通过shell。这很容易做到。
有关详细信息,请参阅this document。
答案 1 :(得分:2)
调用/bin/sh
时,如果希望shell运行命令,则需要传递-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”,我ve还将ioreg
替换为/usr/sbin/ioreg
(并将grep替换为/usr/bin/grep
),以明确表示您对这些特定程序感兴趣。