gpt4 book ai didi

c++ - 在 C++ 中使用 QProcess 重定向 gnome 终端的输出

转载 作者:IT王子 更新时间:2023-10-29 00:36:24 25 4
gpt4 key购买 nike

我正在尝试为将生成终端的 gui 生成子进程。我希望此终端(stdout 和 stderr)生成的数据显示在出现的窗口以及设置的日志文件中。当我直接在 shell 中键入命令时,它会按预期工作,但是当作为启动命令提供给 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);

有没有人对如何解决这个问题有任何建议?我已经尝试使用 QProcess.setStandardErrorFile(foo.log) 和 QProcess.setStandardOutputFile(foo.log) 重定向 stdout 和 stderr,但它似乎是从 gnome 终端本身重定向 stdout(这不是什么)。

最佳答案

您必须在 "-e" 之后将要在终端中执行的整个命令作为一个参数提供给 QProcess,以及要执行的命令在 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

在 bash 中。

您的猜测是正确的,即读取 gnome-terminal 进程的输出不起作用。

关于c++ - 在 C++ 中使用 QProcess 重定向 gnome 终端的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13769741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com