2010-07-11 114 views
6

我在Cocoa項目中使用以下代碼來調用我所做的腳本。該腳本與項目位於同一文件夾中,甚至出現在XCode的「Resources」文件夾下。找到正確的路徑,但它仍然說路徑不可訪問。請幫助。NSTask啓動路徑不可訪問

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

回答

3

什麼,你需要做的就是外殼二進制,並通過你的腳本作爲參數。因此,如果shell腳本是針對bash編寫的,請獲取bash解釋器,並將其參數列表傳遞給一個參數:script.sh的路徑。

+0

謝謝!我是OSX的新手,請告訴我bash翻譯的位置在哪裏? – hassaanm 2010-07-11 01:47:17

+1

/bin,除非用戶修改了基本安裝,這在這方面似乎不大可能。 – jer 2010-07-11 01:56:23

+0

哦,謝謝!/bin/bash似乎正常工作,但現在該程序似乎在任務啓動後停止前進。有關這個的任何線索? – hassaanm 2010-07-11 02:02:05

3

[task launch]前加入這一行:

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

當腳本本身沒有被標記爲可執行文件會出現此錯誤。打開一個終端窗口,轉到該腳本是在你的項目目錄,然後輸入:

chmod +x script.sh 

清潔和構建,您可以直接使用該腳本 - 這也意味着你可以將參數傳遞給它。

1

當我將我的腳本(存儲在App Bundle中)的名稱從foo.sh更改爲foo.command時,我避免了此錯誤。

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

.command擴展名是什麼在Ray Wenderlich tutorial for NSTask/Process使用。我似乎無法找到任何地方記錄(我也確保腳本可以通過chmod +x foo.sh執行)。