21
ifconfig | grep 'inet'

ターミナル経由で実行すると動作します。ただし、QProcess経由ではありません

私のサンプルコードは

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

textedit に何も表示されません。

ifconfigしかし、qprocessの開始時に使用すると、出力がtexteditに表示されます。forやfor のifconfig | grep 'inet'使用など、コマンドを作成するためのトリックを見逃していませんか? 特殊文字用?しかし、私もそれを試しました:(\''\||

4

3 に答える 3

48

QProcess は 1 つのプロセスを実行します。あなたがやろうとしているのは、プロセスではなくシェルコマンドを実行することです。コマンドのパイピングは、シェルの機能です。

次の 3 つの解決策が考えられます。

実行したいコマンドを引数としてshafter -c("command") に置きます:

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、2 つの QProcess を起動し、コードでパイプを実行することです。

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();
于 2012-05-22T11:59:00.570 に答える
9

このQProcessオブジェクトは、本格的なシェル構文を自動的に提供するわけではありません。パイプを使用することはできません。これにはシェルを使用します。

p1.start("/bin/sh -c \"ifconfig | grep inet\"");
于 2012-05-22T11:58:50.960 に答える
6

QProcess ではパイプ記号を使用できないようです。

ただし、出力を次のプロセスにパイプするsetStandardOutputProcessメソッドがあります。

例が API で提供されています。

于 2012-05-22T12:01:33.640 に答える