10

我在我的 Cocoa 项目中使用以下代码来调用我制作的脚本。该脚本与项目位于同一文件夹中,甚至显示在 Xcode 中的“资源”文件夹下。找到了正确的路径,但它仍然说该路径不可访问。请帮忙。

NSBundle *mainBundle=[NSBundle mainBundle];
NSString *path=[mainBundle pathForResource:@"script" ofType:@"sh"];

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: path];

NSLog (path);

NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput: pipe];
[task setStandardError: pipe];

NSFileHandle *file = [pipe fileHandleForReading];

[task launch];
[task waitUntilExit];

NSData *data = [ddFile readDataToEndOfFile];

NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
HDSpeed = [f output];

[f release];    
[task release];

我在调试器中得到的输出是:

2010-07-10 17:53:26.384 tester[5023:a0f] /Users/guest/Library/Developer/Xcode/DerivedData/tester-bhukztmqjwoqrwereagsshvtbfqx/Build/Products/Debug/tester.app/Contents/Resources/script.sh

2010-07-10 17:53:26.386 tester[5023:a0f] launch path not accessible

4

5 回答 5

5

在之前添加这一行[task launch]

[task setLaunchPath:@"/bin/sh"];
于 2011-07-08T03:06:30.123 回答
4

您需要做的是获取 shell 二进制文件,并将您的脚本作为参数传递。因此,如果 shell 脚本是针对 bash 编写的,请获取 bash 解释器,然后将一个参数列表传递给它,其中包含一个参数:script.sh 的路径。

于 2010-07-11T00:57:31.007 回答
2

当脚本本身未标记为可执行时会发生此错误。打开终端窗口并转到脚本在项目目录中的位置,然后输入:

chmod +x script.sh

清理和构建,您可以直接使用脚本 - 这也意味着您可以将参数传递给它。

于 2016-07-20T08:23:22.963 回答
2

当我将脚本的名称(存储在 App Bundle 中)从foo.sh更改为时,foo.command我避免了这个错误。

let path = Bundle.main.path(forResource: "foo", ofType: "command")

.command扩展名在Ray Wenderlich 教程中用于NSTask/Process。我似乎无法在任何地方找到此文档(我还确保脚本可以通过 执行chmod +x foo.sh)。

于 2017-06-13T16:30:55.637 回答
-4

因为 [任务 waitUntilExit];

于 2011-01-27T20:55:02.000 回答