我在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
答案 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];