linux — перенаправление вывода из gnome-терминала с использованием QProcess в Stack Overflow

Я пытаюсь создать подпроцесс для графического интерфейса, который будет портировать терминал. Я хочу, чтобы данные, созданные этим терминалом (stdout и stderr), отображались в открывшемся окне, а также в установленном файле журнала. Когда я набираю команду непосредственно в оболочке, она работает как задумано, но когда она предоставляется QProcess в качестве команды запуска, она фактически ничего не записывает в файл.

Например: если у пользователя нет установленных двоичных файлов, он должен написать в bin.log, что команда не найдена. Я установил свое окружение для порожденного QProcess так же, как запущенный родительский процесс (чтобы он мог находить bash и все остальное), и установил рабочий каталог перед вызовом метода QProcess.start (). Я написал тестовый пример, который следует:

gnome-terminal --title 'Sub-Terminal' -e 'bash -c "foo [args to foo] |& tee foo.log"'

В Qt я делаю следующее:

QProcess *child = new QProcess(this);
QString   cmd   = "gnome-terminal --title 'Sub-Terminal' -e 'bash -c \"foo [args to foo] |& tee foo.log\"'";
child->setProcessEnvironment(<process environment I have created before>);
child->setWorkingDirectory(<current working dir>);
child->start(cmd);
...

Он генерирует терминал, но не записывает никаких данных в foo.log. Я также попробовал следующее:

QProcess *child = new QProcess(this);
QString   prog  = "gnome-terminal"QStringList args;
args << "-x" << "bash" << "foo" << "[foo's arguments]" << "|&" << "tee" << "foo.log";
// set the process env and working dir
child->start(prog, args);

У кого-нибудь есть совет, как решить эту проблему?
Я попытался перенаправить stdout и stderr, используя QProcess.setStandardErrorFile (foo.log) и QProcess.setStandardOutputFile (foo.log), но похоже, что это перенаправило бы stdout с самого терминала gnome (который не является ничем).

4

Решение

Вы должны предоставить всю команду для выполнения в терминале как один единственный аргумент QProcess после "-e", а также команда, которая будет выполнена в bash как один единственный аргумент для bash:

args << "-e" << "bash -c 'foo [args to foo] |& tee foo.log'";

Это в основном выполняет

bash -c 'foo [args to foo] |& tee foo.log'

в терминале, который сам по себе выполняет

foo [args to foo] |& tee foo.log

в баш.

Вы правы, полагая, что читая результаты gnome-terminal процесс не работает

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]