Подтвердить что ты не робот

Команда, работающая в терминале, но не через QProcess

ifconfig | grep 'inet'

работает, когда выполняется через терминал. Но не через QProcess

Мой пример кода

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

Ничего не отображается в textedit.

но когда я использую только ifconfig в начале qprocess, вывод выводится на textedit. Пропустил ли я какой-либо трюк, чтобы построить команду ifconfig | grep 'inet', например, использовать \' для ' и \| для |? для специальных символов? но я тоже это пробовал: (

4b9b3361

Ответ 1

QProcess выполняет один процесс. То, что вы пытаетесь сделать, - это выполнить команду оболочки, а не процесс. Конвейер команд - это особенность вашей оболочки.

Существует три возможных решения:

Поместите команду, которую вы хотите исполнить, в качестве аргумента 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();

Ответ 2

Объект QProcess не дает автоматически полный синтаксис оболочки: вы не можете использовать каналы. Для этого используйте оболочку:

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

Ответ 3

Вы не можете использовать символ pipe в QProcess.

Однако существует setStandardOutputProcess Метод, который будет передавать вывод на следующий процесс.

Пример представлен в API.