简体   繁体   中英

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' 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\"");

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM