命令在终端中工作,但不是通过QProcess

时间:2012-05-22 11:52:06

标签: c++ linux qt terminal pipe

ifconfig | grep 'inet'

通过终端执行时正在工作。但不是通过QProcess

我的示例代码是

QProcess p1;
p1.start("ifconfig | grep 'inet'");
p1.waitForFinished();
QString output(p1.readAllStandardOutput());
textEdit->setText(output);

在textedit上没有显示任何内容。

但是当我在qprocess开始时只使用ifconfig时,输出会显示在textedit上。我是否错过了构建命令ifconfig | grep 'inet'的任何技巧,例如对\'使用'\|使用|?特殊字符?但我也试过了:(

3 个答案:

答案 0 :(得分:41)

QProcess执行一个进程。您要做的是执行 shell命令,而不是进程。命令管道是shell的一个特性。

有三种可能的解决方案:

sh(“命令”)之后将要执行的命令作为参数放到-c

QProcess sh;
sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet");

sh.waitForFinished();
QByteArray output = sh.readAll();
sh.close();

或者您可以将命令编写为sh的标准输入:

QProcess sh;
sh.start("sh");

sh.write("ifconfig | grep inet");
sh.closeWriteChannel();

sh.waitForFinished();
QByteArray output = sh.readAll();
sh.close();

另一种避免sh的方法是启动两个QProcesses并在代码中进行管道处理:

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();

答案 1 :(得分:8)

QProcess对象不会自动为您提供完整的shell语法:您不能使用管道。使用shell:

p1.start("/bin/sh -c \"ifconfig | grep inet\"");

答案 2 :(得分:5)

您似乎无法在QProcess中使用管道符号。

但是有setStandardOutputProcess方法将输出传递给下一个进程。

API中提供了一个示例。