与 QProcess 的符号(&)(非常命令执行)

Ampersand(&) (very command execute) with QProcess

我在上面使用 Qt 和 tcsh,需要执行如下命令:

tcsh: pwd & ls

在 Qt 中:

QString cmd = "pwd & ls";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();`

问题出在和号 ("&") 中,returns 没有任何处理。

首先,让我们弄清楚执行单个命令时会发生什么,例如 pwd。当您这样做时,shell 进程 forks (i.e. produces a child process), then the child process turns into pwd 进程并获得对终端的控制权。

接下来,如果您执行 pwd &,同样的事情会发生,但是子进程(在我们的示例中为 pwd)无法控制终端。它 运行 作为 后台 进程,而 shell 继续与终端一起工作。例如,您可能 运行 一个 GUI 程序 (firefox &),shell 将立即准备 运行 下一个。

最后,当您执行 pwd & ls 时,所有与前一种情况相同的情况都发生了,但是 shell 又分叉了一次并且 运行s ls 在前景。正如您可能猜到的那样,pwd & ls & 会在后台生成两个进程 运行,并且您可以一次执行任意数量的命令。

现在让我们回到Qt。在 运行 命令之前 QProcess 不会 运行 任何 shell。因此,当您通过 QProcess 运行 pwd & ls 时,pwd 将是唯一执行的程序,但它 will get 有两个命令行参数:&ls。两者都将被忽略。

所以 pwd & ls 相当于 两个 QProcess 个对象,每个 运行ning 一个命令。

另一个解决方案是 运行 shell 明确地使参数被解析:

QString cmd = "tcsh -c \"pwd & ls\"";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();