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