QThread不提供被称为shellscript的输出

时间:2019-07-17 10:01:53

标签: c++ bash qt shell

我有一个执行系统调用并将输出写到QTextEdit的函数。

string SystemCallFactory::runSysCallWithoutButton(unique_ptr<SystemCall> sysCall)
{
  cout << "Running " << sysCall->getCommand() << endl;

  textEdit->setText("");
  textEdit->repaint();

  QProcess process;
  process.start(QString::fromStdString(sysCall->getCommand()));
  process.waitForFinished();
  QString output(process.readAllStandardOutput());

  textEdit->append(output);
  textEdit->repaint();

  return output.toStdString();
}

问题是,当getCommand() real 命令(例如, ls /etc,但在引用shellscript时无法正常工作。在我的通话中,无效的通话看起来像

/home/turtle10000/tilematching.sh /some/folder /some/specific.file

脚本将执行并执行应做的工作,但是readAllStandardOutput()返回一个空字符串。当我在终端中运行它时,它会显示预期的输出。

这是shellscript:

#!/bin/sh -v

WORKSPACE=$1
SVPFILE=$2

cd $WORKSPACE
ls -1 *.all > datalist.0.mb-1

mbset -I datalist.0.mb-1 -PSVPMODE:1 -PSVPFILE:$SVPFILE
mbprocess -I datalist.0.mb-1
ls -1 *p.mb58 > datalist.1.mb-1

mbset -I datalist.1.mb-1 -PSONAROFFSETX:-0.079 -PSONAROFFSETY:0.196 -PSONAROFFSETZ:0.048 -PVRUOFFSETX:-0.4473 -PVRUOFFSETY:0.000 -PVRUOFFSETZ:-0.3395 -PROLLBIAS:0.1 -PPITCHBIAS:1.32
mbprocess -I datalist.1.mb-1
ls -1 *pp.mb58 > datalist.2.mb-1

mblist -I datalist.2.mb-1 -MA -O^X^Y-z -JU > output.xyz 

#remove broken lines (error in input files)
sed -ie '/      /d' output.xyz 

编辑:正如Botje所猜测的那样,某些输出出现在stderr中而不是stdout中。

1 个答案:

答案 0 :(得分:0)

按照Botje的建议,我检查了输出是否到达stderr,并且确实如此。无论出于何种原因,mb-system软件包中的工具mbsetmbprocess的输出都将到达stderr。

在这种情况下,我更改了行

QString output(process.readAllStandardOutput());

QString output(process.readAllStandardError());

另一种选择可能是将stderr输出引导到脚本中的stdout。