Путь запуска NSTask недоступен - PullRequest
8 голосов
/ 11 июля 2010

Я использую следующий код в моем проекте 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

Ответы [ 5 ]

5 голосов
/ 08 июля 2011

добавить эту строку перед [task launch]:

[task setLaunchPath:@"/bin/sh"];
4 голосов
/ 11 июля 2010

Что вам нужно будет сделать, это получить двоичный файл оболочки и передать ваш скрипт в качестве аргумента.Поэтому, если сценарий оболочки написан для bash, получите интерпретатор bash и передайте ему список аргументов с одним аргументом: путь к вашему script.sh.

2 голосов
/ 20 июля 2016

Эта ошибка возникает, когда сам скрипт не помечен как исполняемый. Откройте окно терминала и перейдите туда, где скрипт находится в каталоге вашего проекта, затем введите это:

chmod +x script.sh

Очистите и соберите, и вы можете использовать скрипт напрямую - это также означает, что вы можете передавать ему аргументы.

1 голос
/ 13 июня 2017

Когда я меняю имя моего скрипта (хранящегося в комплекте приложений) с foo.sh на foo.command, я избегаю этой ошибки.

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

Расширение .command используется для Рэй Вендерлих учебник для NSTask / Process.Кажется, я нигде не могу найти это документированное (я также проверяю, чтобы скрипт выполнялся через chmod +x foo.sh).

0 голосов
/ 27 января 2011

из-за [task waitUntilExit];

...