web-dev-qa-db-ja.com

コマンドはターミナルで機能しますが、QProcess経由では機能しません

ifconfig | grep 'inet'

端末を介して実行すると動作します。 QProcess経由ではない

私のサンプルコードは

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

テキストエディットには何も表示されません。

しかし、qprocessの開始時にifconfigだけを使用すると、出力がテキストエディットに表示されます。 ifconfig | grep 'inet'\'を使用し、'\|を使用するなど、コマンド|を作成するためのトリックを見逃しましたか?特殊文字のために?しかし私もそれを試しました:(

19
ScarCode

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

考えられる解決策は3つあります。

実行するコマンドを引数として-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を回避する別のアプローチは、2つの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();
41
leemes

QProcessオブジェクトは、完全なシェル構文を自動的に提供しません。パイプは使用できません。これにはシェルを使用します。

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

QProcessではパイプシンボルを使用できないようです。

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

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

5
BergmannF