8

Ok。これに関するスタック オーバーフローに関するいくつかの質問があります。この質問は地雷に最も近い唯一の質問でしたが、通知を使用しています。

コードは非常に単純です。新しい空の 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 つの読み取りパイプをセットアップし、1 つのコマンドを実行します: which git.

XCodeでこれを実行すると、この結果が正しく得られます:

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

build/Products/Debug フォルダーに移動して実行可能ファイルをダブルクリックすると、コンソール アプリに次のメッセージが出力されます。

ここに画像の説明を入力

質問:では、ここでの本当の問題は何ですか? 代替ソリューションを作成しないでください...私も問題が何であるか知りたいです..ありがとう。

4

1 に答える 1

19

OK 答えはスタックオーバーフローであることがわかりましたが、それはさまざまな質問に広がっています。

ここで質問されました-> NSTask を使用したコマンドとここ -> NSTask の起動パスにもアクセスできません

しかし、この日付の時点での彼らの答えは、問題が何であったかについて明確ではありません. NSTask からの質問がユーザーの環境から $PATH を取得しない(質問のタイトルは誤解を招くものでした) を読んだ後でのみ、 NSTask がユーザーの環境から $PATH を取得しないと Cocoaで実行可能ファイルの場所を見つけるという2つの回答があります。私は解決策を実現しました。

これは、NS タスクまたはユーザーのシェル (例: ~/.bashrc) のいずれかをセットアップして、正しい環境 ($PATH) が NSTask によって認識されるようにすることのようです。

解決:

[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"];
于 2013-06-27T10:20:41.473 に答える