命令在terminal中工作,但不通过QProcess

ifconfig | grep 'inet' 

通过terminal执行时正在工作。 但不通过QProcess

我的示例代码是

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

没有什么是显示在textedit。

但是当我在qprocess的开始只使用ifconfig时,输出显示在textedit上。 我有没有想过构build命令ifconfig | grep 'inet'任何技巧? ifconfig | grep 'inet' ,就像用' \| '\|| ? 为特殊字符? 但我也试过,以及:(

Solutions Collecting From Web of "命令在terminal中工作,但不通过QProcess"

QProcess执行一个进程。 你要做的是执行一个shell命令 ,而不是一个进程。 命令的管道是你的shell的一个功能。

有三种可能的解决方案:

把你想要执行的命令作为参数放在-c (“command”)之后sh

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

QProcess对象不会自动给你完整的shell语法:你不能使用管道。 为此使用一个shell:

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

看来你不能在QProcess中使用管道符号。

但是有setStandardOutputProcess方法将输出管道到下一个进程。

API中提供了一个示例。