2012-05-22 3 views
17
ifconfig | grep 'inet' 

funziona quando eseguito mediante il morsetto. Ma non tramite QProcessComando lavorare in terminal, ma non attraverso QProcess

mio codice di esempio è

QProcess p1; 
p1.start("ifconfig | grep 'inet'"); 
p1.waitForFinished(); 
QString output(p1.readAllStandardOutput()); 
textEdit->setText(output); 

Nulla sta ottenendo visualizzato su TextEdit.

ma quando uso solo ifconfig all'avvio di qprocess, l'output viene visualizzato su textedit. Ho perso qualche trucco per costruire il comando ifconfig | grep 'inet', come utilizzare \' per ' e \| per |? per personaggi speciali? ma ho provato anche quello :(

+0

è necessario specificare il percorso completo per ifconifg. La tua applicazione ha una variabile PATH diversa da quella del terminale –

+0

@KamilKlimek Dato che questo potrebbe essere il problema per i singoli comandi, in questo caso il piping dei comandi (che non è supportato da QProcess) è il vero problema. – leemes

+0

Giusto! completamente dimenticato di quello –

risposta

34

QProcess esegue un unico processo. . Quello che si sta cercando di fare è eseguire un comando di shell , non è un processo la tubazione di comandi è una caratteristica della vostra shell

ci sono tre possibili soluzioni:.

Ponga il comman d si desidera eseguire come argomento per sh dopo -c ("comando"):

QProcess sh; 
sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet"); 

sh.waitForFinished(); 
QByteArray output = sh.readAll(); 
sh.close(); 

Oppure si potrebbe scrivere i comandi come standard input a sh:

QProcess sh; 
sh.start("sh"); 

sh.write("ifconfig | grep inet"); 
sh.closeWriteChannel(); 

sh.waitForFinished(); 
QByteArray output = sh.readAll(); 
sh.close(); 

Un altro approccio che evita sh, è quello di lanciare due QProcesses e fare le tubazioni nel codice:

QProcess ifconfig; 
QProcess grep; 

ifconfig.setStandardOutputProcess(&grep); // "simulates" ifconfig | grep 

ifconfig.start("ifconfig"); 
grep.start("grep", QStringList() << "inet"); // pass arguments using QStringList 

grep.waitForFinished(); // grep finishes after ifconfig does 
QByteArray output = grep.readAll(); // now the output is found in the 2nd process 
ifconfig.close(); 
grep.close(); 
+0

E come è fatto? – ScarCode

+5

Ho aggiunto esempi di codice per alcune possibili soluzioni. – leemes

+2

Grep ha funzionato.Ma voglio radunare l'output di ifconfig per awk '/inet/{gsub(/.*:/,"" ,$1);print$1}'. che ha stampato con successo un o/p sul terminale e non tramite Qprocess. Ho usato me 2 thod della tua soluzione – ScarCode

6

L'oggetto QProcess non automaticamente vi darà la sintassi della shell in piena regola: non è possibile utilizzare i tubi utilizzare una shell per questo:.

p1.start("/bin/sh -c \"ifconfig | grep inet\""); 
+1

Ho provato anche questo. ma ancora non funziona !! – ScarCode

+1

Ah sì, dovrebbero essere doppie virgolette, non virgolette. – kmkaplan

+3

alternativa (più sicuro dato che non devi fare attenzione a fuggire all'interno dell'argomento, se è più complicato): usa QStringList per gli argomenti, come questo: 'p1.start ("/bin/sh ", QStringList() < <"-c" << "ifconfig | grep inet"); ' – leemes

4

non è possibile utilizzare il p il simbolo di ipe in QProcess sembra.

Tuttavia, esiste il metodo setStandardOutputProcess che convoglia l'output al processo successivo.

Un esempio è fornito nell'API.