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

Posted

技术标签:

【中文标题】和号(&)(非常命令执行)与 QProcess【英文标题】:Ampersand(&) (very command execute) with QProcess 【发布时间】:2016-11-09 05:45:51 【问题描述】:

我正在使用 Qt 和 tcsh,需要执行以下操作:

tcsh: pwd & ls

在 Qt 中:

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

问题出在与号(“&”)中,进程什么也不返回。

【问题讨论】:

【参考方案1】:

首先,让我们弄清楚当你执行一个命令时会发生什么,比如pwd。当你这样做时,shell进程forks(即产生一个子进程),然后子进程turns intopwd进程并获得对终端的控制。

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

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

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

所以pwd &amp; ls 的等价物将是两个 QProcess 对象,每个对象运行一个命令。

另一种解决方案是显式运行 shell 以使参数被解析:

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

【讨论】:

@elifmutlu 我测试了代码并找到了如何将参数传递给 shell。使用转义的双引号代替撇号。请参阅编辑后的答案。

以上是关于和号(&)(非常命令执行)与 QProcess的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下,&(和号)符号是啥意思?

如何通过 AJAX 发送“&”(和号)字符?

SASS 中选择器末尾的和号 (&) 是选择器的一部分

超链接中的和号导致 W3C 验证失败

和号在函数调用中是什么意思?

《web应用与开发》XML Schema 课堂笔记02