Вопрос по c++, linux, terminal – Команда работает в терминале, но не через 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'
нравится использовать\'
за'
а также\|
за|
? для специальных символов? но я тоже это попробовал :(
что вы пытаетесь сделать, это выполнитьshell commandне процесс. Передача команд является особенностью вашей оболочки.
Есть три возможных решения:
Поместите команду, которую вы хотите выполнить в качестве аргументаsh
после-c
(& Quot; команда & Quot;):
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();
sh
ждет больше команд на стандартный ввод. Вы должны закрыть канал stdin shsh.closeWriteChannel()
между записью и ожиданием. (1): я на 95% уверен, что\n
не обязательно. (1) + (2): если вы делаетеnot закрыть стандартный вводnot написать новую строку, кажется, ничего не происходит. Если вы это сделаете, команда будет выполнена, но только закрытие stdin sh'а завершит работу sh после выполнения. Поэтому, если мы решим (2), нам не нужно заботиться о (1). Если мы хотим выполнить несколько команд, мы должны исправить (1), но не (2).
grep
команда выполнена, илиwaitForFinished()
буду ждать вечно. Я провел быструю проверку, чтобы убедиться, что ваш код работает, и это не для меня, но исправьте меня, если я ошибаюсь :)
QProcess
объект не дает автоматически полный синтаксис оболочки: вы не можете использовать каналы. Используйте оболочку для этого:
Однако естьsetStandardOutputProcess Метод, который направит вывод в следующий процесс.
Пример приведен в API.