我有一个 cocoa 应用程序,我想启动一个启动 Node.js 的 shell 脚本。我想我会用 NSTask 来做到这一点
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/bash/start.sh"];
[task setArguments:[NSArray arrayWithObjects:@"start.sh", nil]];
[task setStandardOutput:[NSPipe pipe]];
[task setStandardInput:[NSPipe pipe]];
[task launch];
该脚本位于我的应用程序的根目录中。我在启动路径中尝试了许多变化,但我被困住了。任何帮助将不胜感激!
编辑:
这是我设置参数的新代码。由于某种原因它仍然无法工作。
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/bash"];
[task setArguments:[NSArray arrayWithObjects:[[NSBundle mainBundle] pathForResource:@"start" ofType:@"sh"], nil]];
[task launch];
最佳答案
正如您所猜测的,问题在于您的启动路径。
启动路径必须是文件的单个路径。文件名不起作用*,并且您不能在同一路径中命名两个单独的文件。
您的启动路径应该是 bash 的完整绝对路径。在终端中使用 which bash
找出是哪一个。 (在普通 OS X 安装上它应该是/bin/bash。)
要告诉 bash 运行脚本,您需要在参数中标识它。仅仅说出剧本的名字是不够的;您必须给出脚本的完整绝对路径。没有理由在任何地方单独使用脚本的文件名。
我假设该脚本是您的应用程序包中的资源。要获取其绝对路径,请询问 your main bundle对于 the URL to that resource ,然后 get that URL's path .
(您可以直接请求a path for a resource,但是使用URL是一个值得养成的习惯。如果您需要具体的优势,基于URL的方法正确地将其第二个参数称为文件扩展名,而不是“类型”; “类型”在现代用法中意味着不同的东西。)
<小时/>*文件名被视为任何其他相对路径。相对路径可以工作,但需要解析为相对于当前工作目录存在的路径。默认情况下,这是/(根目录),因此任何可用的相对路径在功能上等同于绝对路径。您应该在任何地方都使用绝对路径。
关于xcode - 使用 NSTask 启动启动 Node.JS 的 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19183664/