Frage

Ich weiß nicht, warum diese Methode eine leere Zeichenfolge zurückgibt:

- (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;
}

Wenn stattdessen @"git" als Argument vorbei, gehe ich @"which" ich /usr/bin/which wie erwartet zurück. So zumindest das Prinzip funktioniert.

vom Terminal

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

So funktioniert es dort.

Das einzige, was ich denken kann, ist, dass which nicht durch alle Pfade in meiner Umgebung sucht.

Das macht mich verrückt! Hat jemand irgendwelche Ideen?

EDIT: Es sieht aus wie diese über entweder NSTask Einrichtung ist oder die Shell des Benutzers (zB ~ / .bashrc), so dass die richtige Umgebung ($ PATH) durch NSTask gesehen wird.

War es hilfreich?

Lösung

eine Aufgabe über NSTask Lauf verwendet fork() und exec(), um tatsächlich die Aufgabe auszuführen. Die Benutzer-interaktiv Shell ist überhaupt nicht beteiligt. Da $PATH (im Großen und Ganzen) ein Shell-Konzept ist, ist es nicht anwenden, wenn Sie über laufende Prozesse in einer anderen Art und Weise sprechen.

Andere Tipps

Versuchen Sie,

    [task setLaunchPath:@"/bin/bash"];
    NSArray *args = [NSArray arrayWithObjects:@"-l",
                     @"-c",
                     @"which git",
                     nil];
    [task setArguments: args];

Dies ist für mich auf Snow Leopard; Ich habe nicht auf einem anderen System getestet. Die -l (kleines L) sagt bash, und in dem Prozess meines normalen $ PATH bis es abgeholt „handeln, als ob es hatte als Login-Shell aufgerufen wurde“. Das hat bei mir nicht funktioniert, wenn der Startpfad zu / bit / sh, auch mit -l gesetzt wurde.

Sie / usr / local / git / sind in Ihrem $ PATH, wenn Sie das Programm ausführen? Ich denke, which sieht nur in dem $ PATH des Benutzers.

Werfen Sie einen Blick auf die Frage Finden Sie heraus, wo ein ausführbare Datei in Cocoa . Es sieht aus wie das Grundproblem ist das gleiche. Die Antwort leider nicht schön und ordentlich, aber es gibt einige nützliche Informationen gibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top