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

È stato utile?

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 )

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