Domanda

Non so il motivo per cui questo metodo restituisce una stringa vuota:

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

Se invece di passare @"git" come argomento, passo @"which" ricevo /usr/bin/which restituito come previsto. Così almeno le opere principali.

dal terminale

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

Così ci lavora.

L'unica cosa che posso pensare è che which non sta cercando attraverso tutti i percorsi nel mio ambiente.

Questo mi sta facendo impazzire! Qualcuno ha qualche idea?

Modifica Sembra che questo è sull'impostazione sia NSTask o shell dell'utente (ad esempio, ~ / .bashrc) in modo che l'ambiente corretto ($ PATH) è visto da NSTask

È stato utile?

Soluzione

Esecuzione di un'attività tramite NSTask utilizza fork() e exec() per eseguire effettivamente l'operazione. shell interattiva per l'utente non è coinvolto a tutti. Dal momento che è $PATH (in generale) un concetto di shell, non si applica quando si parla di processi in esecuzione in qualsiasi altro modo.

Altri suggerimenti

Prova,

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

Questo ha funzionato per me su Snow Leopard; Non ho ancora testato su qualsiasi altro sistema. Il -l (L minuscola) dice a bash di "agire come se fosse stata invocata come una shell di login", e nel processo ha preso il mio normale $ PATH. Questo non ha funzionato per me, se il percorso di lancio è stato impostato a / bit / sh, anche con -l.

è / usr / local / git / bin nel tuo $ PATH quando si esegue il programma? Credo which guarda solo nel $ PATH dell'utente.

Date un'occhiata alla Scopri posizione di un file eseguibile a Cocoa . Sembra che il problema di fondo è lo stesso. La risposta, purtroppo, non è bello e pulito, ma c'è qualche info utile lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top