xcode - 使用 NSTask 启动启动 Node.JS 的 shell 脚本

标签 xcode node.js cocoa shell nstask

我有一个 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/

相关文章:

node.js - 取消订阅由 of 创建的 Observable

objective-c - Objective-C 中删除字符串中的字符

objective-c - 当我在 cocoa 程序中退出时会发生什么?

arrays - Swift 数组中的 CGFloat

xcode - 如何在 XCode 7.0 中创建 dSYM 文件

ios - 使用 Screen Edge Pan Gesture Recognizer 在 WebView 中后退和前进

ios - 如何在多个 View Controller 中放置 Admob 广告 - Swift、Xcode?

node.js - 设置winston每日logrotate应保留多少个文件

javascript - 安装Node 6后出错,npm ERR!无效版本 : 1. 0.5beta

swift - 将 Realm 与 A​​pp 部分捆绑在一起