ifconfig | grep \'inet\'
is working when executed via terminal. But not via QProcess
My sample code is
QProcess p1;
p1.star
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\"");
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();
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.