NSTask non raccogliendo $ PATH dalla ambiente dell'utente
-
23-08-2019 - |
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
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ì.