Command working in terminal, but not via QProcess
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:(
Solution 1:
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();
Solution 2:
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\"");
Solution 3:
You can not use the pipe symbol in QProcess it seems.
However there is the setStandardOutputProcess Method that will pipe the output to the next process.
An example is provided in the API.