2010-07-11 44 views
6

Tôi đang sử dụng mã sau trong dự án Cocoa của mình để gọi một tập lệnh mà tôi đã tạo. Kịch bản lệnh nằm trong cùng thư mục với dự án và thậm chí hiển thị trong thư mục "Tài nguyên" trong XCode. Con đường thích hợp được tìm thấy, nhưng nó vẫn nói rằng con đường không thể truy cập được. Xin vui lòng giúp đỡ.Đường dẫn khởi chạy NSTask không thể truy cập

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]; 

Kết quả tôi nhận được trong trình gỡ lỗi là:

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

Trả lời

3

Những gì bạn sẽ cần phải làm là lấy nhị phân vỏ, và thông qua kịch bản của bạn như một cuộc tranh cãi. Vì vậy, nếu kịch bản lệnh shell được viết bash nhắm mục tiêu, hãy nhận thông dịch bash, và chuyển cho nó một danh sách đối số với một đối số: đường dẫn đến tệp script.sh của bạn.

+0

Cảm ơn! Tôi mới sử dụng OSX, vì vậy bạn có thể cho tôi biết vị trí của thông dịch viên bash không? – hassaanm

+1

/bin luôn trừ khi người dùng đã sửa đổi cài đặt cơ sở của họ, điều này dường như không có khả năng xảy ra trong vấn đề này. – jer

+0

Oh cảm ơn!/bin/bash dường như làm việc nhưng bây giờ chương trình dường như ngừng di chuyển về phía trước sau khi nhiệm vụ được khởi chạy. Bất kỳ đầu mối về điều này? – hassaanm

3

thêm dòng này trước khi [task launch]:

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

Lỗi này xảy ra khi kịch bản riêng của mình không được đánh dấu như thực thi. Mở một cửa sổ terminal và đi đến nơi kịch bản là trong thư mục dự án của bạn, sau đó nhập này:

chmod +x script.sh 

sạch và xây dựng và bạn có thể sử dụng kịch bản trực tiếp - điều này cũng có nghĩa là bạn có thể vượt qua đối số cho nó.

1

Khi tôi thay đổi tên tập lệnh (được lưu trữ trong Gói ứng dụng) từ foo.sh thành foo.command Tôi tránh lỗi này.

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

Việc gia hạn .command là những gì được sử dụng trong Ray Wenderlich tutorial for NSTask/Process. Tôi không thể tìm thấy tài liệu này ở bất cứ đâu (tôi cũng đảm bảo rằng tập lệnh có thể thực thi qua chmod +x foo.sh).

Các vấn đề liên quan