13

このメソッドが空の文字列を返す理由がわかりません:

- (NSString *)installedGitLocation {
    NSString *launchPath = @"/usr/bin/which";

    // Set up the task
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath:launchPath];
    NSArray *args = [NSArray arrayWithObject:@"git"];
    [task setArguments:args];

    // Set the output pipe.
    NSPipe *outPipe = [[NSPipe alloc] init];
    [task setStandardOutput:outPipe];

    [task launch];

    NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile];
    NSString *path = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    return path;
}

@"git"引数として渡す代わりに渡すと、期待どおり@"which"/usr/bin/which返されます。したがって、少なくとも原則は機能します。

ターミナルから

$ which which
$ /usr/bin/which
$
$ which git
$ /usr/local/git/bin/git

だからそれはそこで動作します。

私が考えることができる唯一のことはwhich、私の環境内のすべてのパスを検索していないということです.

これは私を夢中にさせています!誰にもアイデアはありますか?

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

4

5 に答える 5

23

試す、

    [タスク setLaunchPath:@"/bin/bash"];
    NSArray *args = [NSArray arrayWithObjects:@"-l",
                     @"-c",
                     @"どの git",
                     なし];
    [タスク setArguments: args];

これは Snow Leopard でうまくいきました。他のシステムではテストしていません。-l (小文字の L) は、bash に「ログイン シェルとして呼び出されたかのように動作する」ように指示し、その過程で通常の $PATH を取得します。-l を使用しても、起動パスが /bit/sh に設定されている場合、これは機能しませんでした。

于 2009-11-30T04:39:01.753 に答える
13

NSTask を使用してタスクを実行するfork()exec()、タスクを実際に実行するために と が使用されます。ユーザーのインタラクティブ シェルはまったく関与しません。(概して$PATH)シェルの概念であるため、他の方法でプロセスを実行することについて話している場合は適用されません。

于 2008-12-23T02:17:05.707 に答える
2

プログラムを実行したときに /usr/local/git/bin が $PATH に含まれていますか? whichユーザーの $PATH だけを見ていると思います。

于 2008-12-22T17:29:19.827 に答える
1

Cocoa の実行可能ファイルの場所を見つけるという質問を見てください。基本的な問題は同じようです。残念ながら、答えは適切ではありませんが、役立つ情報がいくつかあります。

于 2008-12-22T18:48:15.860 に答える