C++ 带QProcess的符号(&;)(非常命令执行)

C++ 带QProcess的符号(&;)(非常命令执行),c++,linux,qt,external,qprocess,C++,Linux,Qt,External,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();` QSt

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

tcsh: pwd & ls
在Qt中:

QString cmd = "pwd & ls";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();`
QString cmd=“pwd&ls”;
QProcess*process=新的QProcess;
进程->启动(cmd);
进程->WaitForBytesWrite();
进程->waitForFinished();
qDebug()readAll()`

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

首先,让我们看看执行单个命令时会发生什么,如
pwd
。执行此操作时,shell进程(即生成子进程),然后子进程
pwd
进程并获得对终端的控制

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

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

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

因此,相当于
pwd&ls
的是两个
QProcess
对象,每个对象运行一个命令

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

QString cmd = "tcsh -c \"pwd & ls\"";
QProcess *process = new QProcess;
process->start(cmd);
process->waitForBytesWritten();
process->waitForFinished();
qDebug() << process->readAll();
QString cmd=“tcsh-c\”pwd&ls\”;
QProcess*process=新的QProcess;
进程->启动(cmd);
进程->WaitForBytesWrite();
进程->waitForFinished();
qDebug()readAll();

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