2013-06-27 14 views
7

これについてのスタックオーバーフローに関するいくつかの質問があります。 This question was the only questionは地雷に最も近いが、通知を使用する。NSTask起動パスにアクセスできません。 Xcodeで動作します。 Xcodeのエラーが表示されます

コードは非常に簡単です。新しい空のMac OSXプロジェクトを作成し、applicationDidFinishLaunching:メソッドに次のコードを貼り付けます。実行可能ファイル(この場合はGIT)のパスを取得するはずです。

NSTask *aTask = [[NSTask alloc] init]; 
NSPipe *outputPipe = [NSPipe pipe]; 
NSPipe *errorPipe = [NSPipe pipe]; 

[aTask setStandardOutput: outputPipe]; 
[aTask setStandardError: errorPipe]; 
[aTask setArguments:[NSArray arrayWithObject:@"which"]]; 
[aTask setLaunchPath:@"/usr/bin/git"]; 

NSFileHandle *outputFileHandler = [outputPipe fileHandleForReading]; 
NSFileHandle *errorFileHandler = [errorPipe fileHandleForReading]; 

[aTask launch]; 
[aTask waitUntilExit]; 

// Task launched now just read and print the data 
NSData *data = [outputFileHandler readDataToEndOfFile]; 
NSString *outPutValue = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 

NSData *errorData = [errorFileHandler readDataToEndOfFile]; 
NSString *errorValue = [[NSString alloc] initWithData:errorData encoding:NSUTF8StringEncoding]; 

NSLog(@"Error value: %@",errorValue); 
NSLog(@"Output Value: %@",outPutValue); 

このコードは2本の読み取りパイプを設定し、一つのコマンド実行します:which gitを。

私はXcodeでこれを実行する場合、私は、これはcorretly結果を得る:

Error value: "" 
Output Value: /usr/bin/git 

私は私のビルド/製品/ Debugフォルダに移動し、二重の実行可能ファイルをクリックした場合、私は、コンソールアプリケーションに印刷され、このメッセージが表示されます:

enter image description here

質問:だから、ここは本当に問題は何ですか?ちょうど代替の解決策を作ってください...私はまた、問題が何かを知りたいです..ありがとう。

答えて

13

OKはスタックオーバーフローにありますが、異なる質問間に広がっています。

質問がここに頼まれた -

同様> NSTask launch path not accessibleしかし、この日の時点でその答えは、問題が何であったかのよう明確アレント - > Commands with NSTaskここ。 NSTask not picking up $PATH from the user's environment(質問のタイトルは誤解を招いていました)から質問を読んだ後で、これらの2つの回答 NSTask not picking up $PATH from the user's environmentFind out location of an executable file in Cocoaで私は解決策を実現しました。

これが正しい 環境($のPATH)がNSTaskで見られるようにNS タスクやユーザのシェル(例えば、〜/ .bashrcの)いずれかの設定についてであるように見えます。

ソリューション:

[task setLaunchPath:@"/bin/bash"]; 
NSArray *args = [NSArray arrayWithObjects:@"-l", 
       @"-c", 
       @"which git", //Assuming git is the launch path you want to run 
       nil]; 
[task setArguments: args]; 

しかしこれは、ユーザーのシェルが常に bashのであり、それは他人のために失敗する前提としています。これを解決するには、シェルを決定します。

NSDictionary *environmentDict = [[NSProcessInfo processInfo] environment]; 
NSString *shellString = [environmentDict objectForKey:@"SHELL"]; 
関連する問題