Avvio di un file SH con NSTask
Domanda
Ecco il mio codice:
-(void)startTask{
NSString * cmd = @"/bin/sh";
pty_ = [[PseudoTTY alloc] init];
NSTask * task = [[NSTask alloc] init];
[task setStandardInput:[pty_ slaveFileHandle]];
[task setStandardOutput:[pty_ slaveFileHandle]];
[task setStandardError:[pty_ slaveFileHandle]];
[task setCurrentDirectoryPath:[@"~" stringByExpandingTildeInPath]];
[task setLaunchPath:@"/bin/sh /applications/jarvis/brain/server.sh"];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(didRead:)
name:NSFileHandleReadCompletionNotification
object:[pty_ masterFileHandle]];
[[pty_ masterFileHandle] readInBackgroundAndNotify];
[task launch];
[self insertText:
[NSString stringWithFormat:@"Started %@ on terminal %@", cmd, [pty_ name]]];
}
Ma, invece di questo, ho bisogno di avviare un file SH: /applications/brain/server.sh
Sono confuso ....
Può qualcuno aiutarlo con il mio codice?
Grazie, Elia
Soluzione
[task setCurrentDirectoryPath:[@"~" stringByExpandingTildeInPath]];
Si può solo chiamare NSHomeDirectory
per ottenere il percorso directory home.
[task setLaunchPath:@"/bin/sh /applications/jarvis/brain/server.sh"];
Il file non esiste. Non v'è alcuna directory chiamata “sh” all'interno della directory / bin; come tale, non v'è alcuna sottodirectory “applicazioni” all'interno di quella, nessun “Jarvis” sottodirectory all'interno che, non sottodirectory “cervello” all'interno di quella, e nessun file “server.sh” all'interno di quella.
Ricordate che NSTask non è la shell. trucchi Shell non funzionano su di esso; non rappresenti un argomento di parsing, variabili d'ambiente di interpolazione o ~ (si noti che si doveva farlo in modo esplicito), o qualsiasi altra cosa la shell fa. È possibile utilizzare solo il guscio lo stesso di qualsiasi altro programma.
È necessario impostare il percorso di lancio per il percorso della shell, e passare il percorso dello script di shell come primo argomento. In alternativa, se si sa che il file di script di shell è eseguibile (e ha il corretto shebang in esso), è possibile passare il percorso del file di script come il percorso di lancio e omettere gli argomenti.
Altri suggerimenti
Prova:
// make sure server.sh begins with #!/bin/sh
NSString * cmd = @"/applications/brain/server.sh";
// ...
[task setLaunchPath:cmd];
(codice originale da: http://amath.colorado.edu/pub /mac/programs/PseudoTTY.zip )