4

我正在尝试为将产生终端的 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 终端本身重定向标准输出(这不是什么)。

4

1 回答 1

2

您必须提供要在终端中执行的整个命令作为QProcessafter的单个参数"-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

在 bash 中。

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

于 2012-12-07T19:57:49.817 回答