从应用程序中获取Cocoa Objective-C shell脚本?

3

我正在创建一个应用程序,希望从其中运行一些shell脚本。其中一个脚本创建了一个.plist文件,另一个对一个二进制文件进行了修补。之所以要使用shell脚本,是因为我知道它可以实现我需要的两个功能。虽然我不知道如何使用Objective-C/Cocoa完成这个任务,但我相信有办法可以做到。如果您有任何建议,请告诉我,将不胜感激。


你是指MacOS还是?不过在iOS上,你可以轻松地从obj-c直接创建plists和修补二进制文件(仅限可写目录)。 - ott--
抱歉我没有澄清,这是针对OS X的。 - user963395
可能是重复的问题:从Cocoa应用程序执行终端命令 - mmmmmm
2个回答

5
你需要使用NSTaskNSTask是一个运行任何终端命令的系统。以下是你如何使用它来执行shell脚本的示例:
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/path/to/script/sh"];
[task setArguments:[NSArray arrayWithObjects:@"yourScript.sh", nil]];
[task setStandardOutput:[NSPipe pipe]];
[task setStandardInput:[NSPipe pipe]];

[task launch];
[task release];

那将执行命令/path/to/script/sh yourScript.sh。如果您的脚本需要任何参数,可以将它们添加到参数数组中。标准输出将重定向所有输出到管道对象,如果您想要输出到文件,则可以将其挂接到该对象上。我们需要使用另一个NSPipe用于输入的原因是使NSLog正常工作,而不是记录到脚本中。
如果您想了解更多有关NSTask如何工作的信息,请参见此答案

谢谢你提供这个很棒的例子。有没有办法将脚本编译成二进制文件? - user963395
@Buxme:您可以将shell脚本添加到您的项目中,并使用[[NSBundle mainBundle] pathForResource:@"scriptName" ofType:@"sh"]获取其路径。然后只需将该路径用作第一个参数,它应该可以正常运行。 - Alexis King
这会导致终端打开以执行脚本,还是会导致Objective-C应用程序在不打开终端的情况下运行脚本? - John Militer

3
我知道的最简单的方法是使用NSTask。就像从终端命令中调用bash脚本一样。

比终端命令更好的是,你可以通过数组传递参数直接运行程序任务;由于没有涉及 shell,你不需要担心 shell 转义。 - Peter Hosey
很好。你有没有一个例子?另外,我的应用程序调用shell脚本不会很明显吗?或者这根本不是一个shell脚本?顺便说一下 - 我希望将脚本编译成二进制文件。 - user963395
@Buxme:你所说的“显而易见”是什么意思?除非用户查看活动监视器,否则他们无法知道您正在运行另一个进程。 - Peter Hosey
@PeterHosey — 是的,那将定义显而易见。 - user963395

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接