Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Command working in terminal, but not via QProcess

Tags:

ifconfig | grep 'inet' 

is working when executed via terminal. But not via QProcess

My sample code is

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

Nothing is getting displayed on textedit.

but when I use just ifconfig in start of qprocess, output is getting displayed on textedit. Did I miss any trick to construct the command ifconfig | grep 'inet' , like use \' for ' and \| for |? for special characters? but I tried that as well:(

like image 805
ScarCode Avatar asked May 22 '12 11:05

ScarCode


2 Answers

QProcess executes one single process. What you are trying to do is executing a shell command, not a process. The piping of commands is a feature of your shell.

There are three possible solutions:

Put the command you want to be executed as an argument to sh after -c ("command"):

QProcess sh; sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet");  sh.waitForFinished(); QByteArray output = sh.readAll(); sh.close(); 

Or you could write the commands as the standard input to sh:

QProcess sh; sh.start("sh");  sh.write("ifconfig | grep inet"); sh.closeWriteChannel();  sh.waitForFinished(); QByteArray output = sh.readAll(); sh.close(); 

Another approach which avoids sh, is to launch two QProcesses and do the piping in your code:

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(); 
like image 102
leemes Avatar answered Nov 06 '22 06:11

leemes


The QProcess object does not automatically give you full blown shell syntax: you can not use pipes. Use a shell for this:

p1.start("/bin/sh -c \"ifconfig | grep inet\""); 
like image 26
kmkaplan Avatar answered Nov 06 '22 05:11

kmkaplan