Đây là mã của tôi:NSTask NSPipe - dòng khách quan c lệnh giúp đỡ
task = [[NSTask alloc] init];
[task setCurrentDirectoryPath:@"/applications/jarvis/brain/"];
[task setLaunchPath:@"/applications/jarvis/brain/server.sh"];
NSPipe * out = [NSPipe pipe];
[task setStandardOutput:out];
[task launch];
[task waitUntilExit];
[task release];
NSFileHandle * read = [out fileHandleForReading];
NSData * dataRead = [read readDataToEndOfFile];
NSString * stringRead = [[[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding] autorelease];
Vì vậy, tôi đang cố gắng để tái tạo này:
cd /applications/jarvis/brain/
./server.sh
nhưng sử dụng NSTask trong Objective-C.
Vì một số lý do, khi tôi chạy mã này, stringRead, không trả về gì cả. Nó sẽ trả về terminal nào sẽ trả về khi tôi khởi chạy file .sh. Chính xác?
Bất kỳ ý tưởng nào?
Elijah
Bạn có chắc là tập lệnh server.sh có tiêu chuẩn không? Có lẽ bạn nên treo lên stderr là tốt và xem nếu có chứa bất cứ điều gì. Bạn cũng có thể xem xét đọc dữ liệu từ đường ống khi tác vụ đang chạy, vì nếu nó cố gắng in quá nhiều vào đường ống trong khi bạn không đọc và bộ đệm sẽ đầy, tác vụ sẽ treo vào lần tiếp theo nó cố gắng xuất ra bất cứ thứ gì. –
Tôi không chắc chắn. Bạn có thể chỉ cho tôi một ví dụ? Có, tôi đã xóa [release release] và [task waitUntilExit]. Cùng một vấn đề. – objectiveccoder001
Bạn đang kiểm tra nội dung của stringRead theo chương trình (hoặc trong gdb), hoặc bạn đang cố gắng in chúng ra bằng cách sử dụng NSLog hay gì đó? Nếu bạn đang sử dụng NSLog và không thấy đầu ra nào, hãy kiểm tra Nhật ký Console trong Ứng dụng> Tiện ích cho đầu ra của bạn. Shell script chạy dưới dạng NSTask có thể làm cho đầu ra của bàn điều khiển Xcode ngừng hoạt động. Ngoài ra, tôi lấy ý kiến của Kevin để kiểm tra xem có lỗi gì về lỗi chuẩn (chỉ cần thêm một đường ống thứ hai và đặt làm lỗi tiêu chuẩn cho công việc của bạn) và không dựa vào đường ống có thể đệm tất cả đầu ra của nhiệm vụ của bạn. – puzzle