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:(
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();
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\"");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With