无法访问NSTask启动路径

时间:2010-07-11 00:54:43

标签: objective-c cocoa path nsbundle nstask

我在Cocoa项目中使用以下代码来调用我创建的脚本。该脚本与项目位于同一文件夹中,甚至显示在XCode的“Resources”文件夹下。找到了正确的路径,但仍然说路径无法访问。请帮助。

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

5 个答案:

答案 0 :(得分:5)

[task launch]之前添加此行:

[task setLaunchPath:@"/bin/sh"];

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

chmod +x script.sh

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

答案 3 :(得分:1)

当我将脚本名称(存储在应用程序包中)从foo.sh更改为foo.command时,我会避免此错误。

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

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

答案 4 :(得分:-2)

因为[task waitUntilExit];